![數(shù)據(jù)庫(kù)程序員面試分類(lèi)真題13_第1頁(yè)](http://file4.renrendoc.com/view2/M03/1C/0D/wKhkFmZX1_qAAZ9bAAMekH0HB4o830.jpg)
![數(shù)據(jù)庫(kù)程序員面試分類(lèi)真題13_第2頁(yè)](http://file4.renrendoc.com/view2/M03/1C/0D/wKhkFmZX1_qAAZ9bAAMekH0HB4o8302.jpg)
![數(shù)據(jù)庫(kù)程序員面試分類(lèi)真題13_第3頁(yè)](http://file4.renrendoc.com/view2/M03/1C/0D/wKhkFmZX1_qAAZ9bAAMekH0HB4o8303.jpg)
![數(shù)據(jù)庫(kù)程序員面試分類(lèi)真題13_第4頁(yè)](http://file4.renrendoc.com/view2/M03/1C/0D/wKhkFmZX1_qAAZ9bAAMekH0HB4o8304.jpg)
![數(shù)據(jù)庫(kù)程序員面試分類(lèi)真題13_第5頁(yè)](http://file4.renrendoc.com/view2/M03/1C/0D/wKhkFmZX1_qAAZ9bAAMekH0HB4o8305.jpg)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)庫(kù)程序員面試分類(lèi)真題13簡(jiǎn)答題1.
如何列舉某個(gè)用戶(hù)下所有表的注釋及列的注釋?正確答案:可以使用DBA_TAB_COMMENTS視圖來(lái)查詢(xún)表的注釋?zhuān)褂肈BA_COL_COMMENTS視圖來(lái)查(江南博哥)詢(xún)列的注釋。某個(gè)用戶(hù)下所有表的注釋?zhuān)?/p>
SELECTD.OWNER,D.TABLE_NAME,D.COMMENTSFROMDBA_TAB_COMMENTSDWHERED.OWNER='LHR'ANDD.COMMENTSISNOTNULL;
其結(jié)果如下:
某個(gè)用戶(hù)下某個(gè)表的所有列的注釋?zhuān)?/p>
SELECTD.OWNER,D.TABLE_NAME,D.COLUMN_NAME,D.COMMENTS
FROMDBA_COL_COMMENTSDWHERED.OWNER='LHR'
ANDD.TABLE_NAME='CMMND_INFO_HSTRY'ANDD.COMMENTSISNOTNULL;
其結(jié)果如下:
2.
Oracle10g和11g告警日志文件的位置在哪里?正確答案:告警日志文件有兩種類(lèi)型,一種是純文本格式的,另外一種是xml文件格式的,平時(shí)查看最多的是純文本格式的告警日志。告警日志的內(nèi)容包含消息和錯(cuò)誤的類(lèi)型,ORA-600內(nèi)部錯(cuò)誤,ORA-1578塊損壞錯(cuò)誤,ORA-12012作業(yè)隊(duì)列錯(cuò)誤,實(shí)例啟動(dòng)關(guān)閉、恢復(fù)等信息,特定的DDL命令,影響表空間、數(shù)據(jù)文件及回滾段的命令,可持續(xù)的命令被掛起,LGWR不能寫(xiě)入日志文件,歸檔進(jìn)程啟動(dòng)信息、調(diào)度進(jìn)程的相關(guān)信息和動(dòng)態(tài)參數(shù)的修改信息等。
無(wú)論是Oracle10g還是11g,其告警日志的位置都可以由參數(shù)BACKGROUND_DUMP_DEST來(lái)查詢(xún),只不過(guò)在Oracle11g中位置有所變化。在Oracle10g中,告警日志一般在$ORACLE_BASE/admin/$ORACLE_SID/bdump目錄下:
在Oracle11g中,告警日志一般在$ORACLE_BASE/diag/rdbms/$DBNAME/$ORACLE_SID/traca目錄下:
從Oracle開(kāi)始,參數(shù)BACKGROUND_DUMP_DEST已廢棄,告警日志的位置應(yīng)該由以下SQL來(lái)查詢(xún):
SQL>SELECTd.VALUEFROMV$DIAG_INFOdWHEREd.NAME='DiagTrace';
VALUE
--------------------------------------------
/u01/app/oraele/diag/rdbms/lhrdb/lhrdb/trace
需要注意的是,該SQL也適用于Oracle11g的版本。
3.
若告警日志文件過(guò)大,則如何有效管理告警日志文件?正確答案:由于告警日志按時(shí)間的先后順序不斷累積存儲(chǔ),久而久之,勢(shì)必造成告警日志的過(guò)大,難以維護(hù),查找相關(guān)的信息也不方便。另外,若告警日志超大,也會(huì)嚴(yán)重影響系統(tǒng)的性能。這里提供3種辦法來(lái)管理告警日志:①使用外部表方式來(lái)管理告警日志將大大簡(jiǎn)化維護(hù)工作量,也可以更直觀地獲取所需的信息;②視圖V$DIAG_ALERT_EXT對(duì)應(yīng)的基表里存儲(chǔ)了告警日志的內(nèi)容,可以根據(jù)該視圖將告警日志的內(nèi)容存儲(chǔ)在歷史表中;③利用SHELL腳本定時(shí)將告警日志進(jìn)行備份,防止告警日志過(guò)大而影響系統(tǒng)性能。
4.
數(shù)據(jù)庫(kù)處于RESTRICT、QUIESCE和SUSPEND狀態(tài)的區(qū)別是什么?正確答案:在Oracle中,數(shù)據(jù)庫(kù)可以有3種限制性狀態(tài),見(jiàn)下表。
需要注意的是,可以使用“SELECT*FROMSESSION_ROLES;”查詢(xún)當(dāng)前用戶(hù)具有的角色。
5.
數(shù)據(jù)庫(kù)的啟動(dòng)經(jīng)歷幾個(gè)過(guò)程?正確答案:Oracle數(shù)據(jù)庫(kù)的啟動(dòng),嚴(yán)格來(lái)說(shuō)應(yīng)該是實(shí)例的啟動(dòng),數(shù)據(jù)庫(kù)僅僅是在實(shí)例啟動(dòng)后進(jìn)行裝載。Oracle數(shù)據(jù)庫(kù)啟動(dòng)的過(guò)程被劃分為幾個(gè)不同的步驟,在不同的啟動(dòng)過(guò)程中,可以對(duì)其實(shí)現(xiàn)不同的操作。
啟動(dòng)命令:STARTUP[FORCE][RESTRICT][PFILE=...][NOMOUNT][MOUNT][OPEN]
啟動(dòng)過(guò)程:NOMOUNT--->MOUNT--->OPEN,詳細(xì)情況見(jiàn)下表。
6.
關(guān)閉數(shù)據(jù)庫(kù)有幾種方式?正確答案:數(shù)據(jù)庫(kù)的關(guān)閉也有一些參數(shù)需要注意,關(guān)閉命令為
SHUTDOWNABORT|IMMEDIATE|TRANSACTIONAL|NORMAL
其中,SHUTDOWN不帶參數(shù)將默認(rèn)為NORMAL。一般情況下,關(guān)閉數(shù)據(jù)庫(kù)都使用“SHUTDOWNIMMEDIATE”命令。這幾個(gè)參數(shù)的區(qū)別見(jiàn)下表。SHUTDOWNNORMALTRANSACTIONALIMMEDIATEABORT是否允許新連接NNNN是否允許新事務(wù)YNNN是否等待所有來(lái)提交事務(wù)完成提交YYNN等待所有會(huì)話(huà)斷開(kāi)連接YNNN強(qiáng)制檢查點(diǎn)YYYN實(shí)例恢復(fù)NNNY告警日志Shuttingdowninstance(normal)Shuttingdowninstance(transactional)Shuttingdowninstance(immediate)Shuttingdowninstance(abort)
1)NORMAL表示不準(zhǔn)許新的連接,等待當(dāng)前所有連接到數(shù)據(jù)庫(kù)系統(tǒng)的用戶(hù)都斷開(kāi)連接(DISCONNECT),強(qiáng)制檢查點(diǎn)并關(guān)閉文件,下次啟動(dòng)不需要實(shí)例恢復(fù)。
2)TRANSACTIONALE表示不準(zhǔn)許新的連接,不允許開(kāi)啟新事務(wù),數(shù)據(jù)庫(kù)等待所有事務(wù)完成后斷開(kāi)當(dāng)前連接到數(shù)據(jù)庫(kù)的所有用戶(hù),強(qiáng)制檢查點(diǎn)并關(guān)閉文件,下次啟動(dòng)不需要實(shí)例恢復(fù)。
3)IMMEDIATE表示不準(zhǔn)許新的連接,不允許開(kāi)啟新事務(wù),任何未提交的事務(wù)都進(jìn)行回滾。數(shù)據(jù)庫(kù)顯式回滾活動(dòng)的事務(wù)并斷開(kāi)所有當(dāng)前連接到數(shù)據(jù)庫(kù)的用戶(hù),強(qiáng)制檢查點(diǎn)并關(guān)閉文件,下次啟動(dòng)不需要實(shí)例恢復(fù)。
4)ABORT表示不準(zhǔn)許新的連接,不允許開(kāi)啟新事務(wù),任何未提交的事務(wù)不進(jìn)行回滾。數(shù)據(jù)庫(kù)立刻中斷所有sQL的執(zhí)行,并斷開(kāi)所有用戶(hù)的連接。不做強(qiáng)制檢查點(diǎn),下次啟動(dòng)需要做實(shí)例恢復(fù)。
7.
索引包括那幾個(gè)特性?正確答案:一般來(lái)說(shuō)索引有3大特性,即索引高度比較低、索引存儲(chǔ)列值及索引本身有序,對(duì)這3大特性的應(yīng)用見(jiàn)下表。索引特性帶來(lái)的優(yōu)勢(shì)應(yīng)用的常見(jiàn)SQL高度比較低索引高度低有利于索引范圍掃描,這也是通過(guò)索引可以非常迅速地從海量數(shù)據(jù)中獲取少量數(shù)據(jù)的原因。索引的高度越高,訪(fǎng)問(wèn)索引需要讀取的數(shù)據(jù)塊數(shù)越多,效率越差SELECT*FROMTWHEREID=1;索引存儲(chǔ)列值由于索引比表一般要小得多,所以在通過(guò)索引本身就可以查找到所需要的數(shù)據(jù)的情況下,可以將表看成是一個(gè)“瘦表”或“小表”,無(wú)須索引回表讀這個(gè)過(guò)程(索引回表讀是非常耗費(fèi)性能的),這樣訪(fǎng)問(wèn)路徑就會(huì)大大減少。利用該特性可以?xún)?yōu)化的SQL包括COUNT(*)、SUM(索引列)等聚合語(yǔ)句SELECTCOUNT(*)FROMT;SELECTSUM(OBJECT_ID)FROMT;索引本身有序能夠利用索引本身已有的排序特性來(lái)消除目標(biāo)SQL的排序操作,從而優(yōu)化ORDERBY等排序語(yǔ)句SELECT*FROMTWHEREOBJECT_ID>2ORDERBYOBJECT_ID;能夠用索引有序的特性在葉子塊的最左邊或最右邊找到最小和最大值,從而優(yōu)化類(lèi)型MAX、MIN語(yǔ)句SELECTMAX(OBJECT_ID)FROMT;
另外,需要特別注意的是,索引不存儲(chǔ)空值。[考點(diǎn)]索引
8.
如何預(yù)估即將創(chuàng)建索引的大小?正確答案:如果當(dāng)前表大小是1TB,那么在某一列上創(chuàng)建索引的話(huà)索引大概占用多大的空間?對(duì)于這個(gè)問(wèn)題,Oracle提供了2種可以預(yù)估將要?jiǎng)?chuàng)建的索引大小的辦法:
1)利用系統(tǒng)包DBMS_SPACE.CREATE_INDEX_COST直接得到。利用DBMS_SPACE.CREATE_TABLE_COST可以獲得將要?jiǎng)?chuàng)建的表的大小。
2)利用Oracle11g新特性NOTERAISEDWHENEXPLAINPLANFORCREATEINDEX。[考點(diǎn)]索引
9.
如何監(jiān)控索引的使用狀況?正確答案:在開(kāi)發(fā)應(yīng)用程序時(shí),可能會(huì)建立很多索引,那么這些索引的使用到底怎么樣,是否有些索引一直都沒(méi)有用到過(guò),在這種情況下就需要對(duì)這些索引進(jìn)行監(jiān)控,以便確定它們的使用情況,并為是否可以清除它們給出依據(jù)。
監(jiān)控索引有兩種方式:
(1)直接監(jiān)控索引的使用情況
1)設(shè)置所要監(jiān)控的索引:ALTERINDEXIDX_T_XXMONITORINGUSAGE;
2)查看該索引有沒(méi)有被使用:SELECT*FROMV$OBJECT_USAGE;
3)關(guān)閉監(jiān)控:ALTERINDEXIDX_T_XXNOMONITORINGUSAGE;
查詢(xún)V$OBJECT_USAGE就可以知道數(shù)據(jù)庫(kù)對(duì)索引的使用情況。通過(guò)一段時(shí)間的監(jiān)控,就可以確定哪些是無(wú)用的索引。另外,為了避免使用V$OBJECT_USAGE只能查詢(xún)到當(dāng)前用戶(hù)下索引的監(jiān)控情況,可以使用如下語(yǔ)句查詢(xún)數(shù)據(jù)庫(kù)中所有被監(jiān)控索引的使用情況:
SELECTU.NAMEOWNER,IO.NAMEINDEX_NAME,T.NAMETABLE_NAME,DECODE(BITAND(I.FLAGS,65536),0,'NO','YES')MONITORING,
DECODE(BITAND(OU.FLAGS,1),0,'NO','YES')USED,
OU.START_MONITORINGSTART_MONITORING,
OU.END_MONITORINGEND_MONITORING
FROMSYS.USERSU,
SYS.OBJ$IO,
SYS.OBJ$
T.
SYS.IND$I,
SYS.OBJECT_USAGEOU
WHEREI.OBJ#=OU.OBJ#
ANDIO.OBJ#=OU.OBJ#
ANDT.OBJ#=I.BO#
ANDU.USER#=IO.OWNER#;
(2)通過(guò)查看歷史的執(zhí)行計(jì)劃,分析索引的使用情況
可以從視圖DBA_HIST_SQL_PLAN中獲取到數(shù)據(jù)庫(kù)中所有索引的掃描次數(shù)情況,然后根據(jù)掃描次數(shù)和開(kāi)發(fā)人員溝通是否需要保留索引。[考點(diǎn)]索引
10.
哪些操作會(huì)導(dǎo)致索引失效?正確答案:當(dāng)某些操作導(dǎo)致數(shù)據(jù)行的ROWID改變,索引就會(huì)完全失效??梢苑制胀ū砗头謪^(qū)表來(lái)討論哪些操作將導(dǎo)致索引失效。
1)普通表索引失效的情形如下:
①手動(dòng)置索引無(wú)效:ALTERINDEXIND_OBJECT_IDUNUSABLE;。
②如果對(duì)表進(jìn)行MOVE操作(包含移動(dòng)表空間和壓縮操作)或在線(xiàn)重定義表后,那么該表上所有的索引狀態(tài)會(huì)變?yōu)閁NUSABLE。MOVE操作的SQL語(yǔ)句為ALTERTABLETTMOVE;。
③SQL*Loader加載數(shù)據(jù)。
在SQL*Loader加載過(guò)程中會(huì)維護(hù)索引,由于數(shù)據(jù)量比較大,在SQL*Loader加載過(guò)程中出現(xiàn)異常情況,也會(huì)導(dǎo)致Oracle來(lái)不及維護(hù)索引,導(dǎo)致索引處于失效狀態(tài),影響查詢(xún)和加載。異常情況主要有在加載過(guò)程中殺掉SQL*Loader進(jìn)程、重啟或表空間不足等。
2)分區(qū)表索引失效的情形如下:
①對(duì)分區(qū)表的某個(gè)含有數(shù)據(jù)的分區(qū)執(zhí)行了TRUNCATE、DROP操作可以導(dǎo)致該分區(qū)表的全局索引失效,而分區(qū)索引依然有效,如果操作的分區(qū)沒(méi)有數(shù)據(jù),那么不會(huì)影響索引的狀態(tài)。需要注意的是,對(duì)分區(qū)表的ADD操作對(duì)分區(qū)索引和全局索引沒(méi)有影響。
②執(zhí)行EXCHANGE操作后,全局索引和分區(qū)索引都會(huì)被無(wú)條件地置為UNUSABLE(無(wú)論分區(qū)是否含有數(shù)據(jù))。但是,若包含INCLUDINGINDEXES子句(默認(rèn)情況下為EXCLUDINGINDEXES),則全局索引會(huì)失效,而分區(qū)索引依然有效。
③如果執(zhí)行SPLIT的目標(biāo)分區(qū)含有數(shù)據(jù),那么在執(zhí)行SPLIT操作后,全局索引和分區(qū)索引都會(huì)被置為UNUSABLE。如果執(zhí)行SPLIT的目標(biāo)分區(qū)沒(méi)有數(shù)據(jù),那么不會(huì)影響索引的狀態(tài)。
④對(duì)分區(qū)表執(zhí)行MOVE操作后,全局索引和分區(qū)索引都會(huì)被置于無(wú)效狀態(tài)。
⑤手動(dòng)置其無(wú)效:ALTERINDEXIND_OBJECT_IDUNUSABLE;。
對(duì)于分區(qū)表而言,除了ADD操作之外,TRUNCATE、DROP、EXCHANGE和SPLIT操作均會(huì)導(dǎo)致全局索引失效,但是可以加上UPDATEGLOBALINDEXES子句讓全局索引不失效。重建分區(qū)索引的命令為ALTERINDEXIDX_RANG_LHRREBUILDPARTITIONP1;。[考點(diǎn)]索引
11.
聚簇因子(ClusteringFactor)是什么?正確答案:Oracle數(shù)據(jù)庫(kù)中最普通、最為常用的即為堆表,堆表的數(shù)據(jù)存儲(chǔ)方式為無(wú)序存儲(chǔ),當(dāng)對(duì)數(shù)據(jù)進(jìn)行檢索的時(shí)候,非常消耗資源,這個(gè)時(shí)候就可以為表創(chuàng)建索引了。在索引中,數(shù)據(jù)是按照一定的順序排列起來(lái)的。當(dāng)新建或重建索引時(shí),索引列上的順序是有序的,而表上的順序是無(wú)序的,這樣就存在了差異,即表現(xiàn)為聚簇因子(ChasteringFactor,CF),也稱(chēng)為群集因子或集群因子等,本書(shū)統(tǒng)一稱(chēng)為聚簇因子。聚簇因子值的大小對(duì)CBO判斷是否選擇相關(guān)的索引起著至關(guān)重要的作用。
在Oracle數(shù)據(jù)庫(kù)中,聚簇因子是指按照索引鍵值排序的索引行和存儲(chǔ)于對(duì)應(yīng)表中數(shù)據(jù)行的存儲(chǔ)順序的相似程度,也就是說(shuō),表中數(shù)據(jù)的存儲(chǔ)順序和某些索引字段順序的符合程度。CF是基于表上索引列上的一個(gè)值,每一個(gè)索引都有一個(gè)CF值。
Oracle按照索引塊所存儲(chǔ)的ROWID來(lái)標(biāo)識(shí)相鄰索引記錄在表塊中是否為相同塊。好的CF值接近于表上的塊數(shù),而差的CF值則接近于表上的行數(shù)。CF值越小,相似度越高,CF值越大,相似度越低。如果CF的值接近塊數(shù),那么說(shuō)明表的存儲(chǔ)和索引存儲(chǔ)排序接近,也就是說(shuō)表中的記錄很有序,這樣在做INDEXRANGESCAN的時(shí)候,讀取少量的數(shù)據(jù)塊就能得到想要的數(shù)據(jù),代價(jià)比較小。如果CF值接近表記錄數(shù),那么說(shuō)明表的存儲(chǔ)和索引排序差異很大,在做INDEXRANGESCAN的時(shí)候,由于表記錄分散,所以會(huì)額外讀取多個(gè)塊,代價(jià)較高。
由于聚簇因子高的索引走索引范圍掃描時(shí)比相同條件下聚簇因子低的索引要耗費(fèi)更多的物理I/O,所以聚簇因子高的索引走索引范圍掃描的成本會(huì)比相同條件下聚簇因子低的索引走索引范圍掃描的成本高。Oracle選擇索引范圍掃描的成本可以近似看作是和聚簇因子成正比,因此,聚簇因子值的大小實(shí)際上對(duì)CBO判斷是否走相關(guān)的索引起著至關(guān)重要的作用。其實(shí),聚簇因子決定著索引回表讀的開(kāi)銷(xiāo)。在Oracle數(shù)據(jù)庫(kù)中,能夠降低目標(biāo)索引的聚簇因子的唯一方法就是對(duì)表中數(shù)據(jù)按照目標(biāo)索引的索引鍵值排序后重新存儲(chǔ)。需要注意的是,這種方法可能會(huì)同時(shí)增加該表上存在的其他索引的聚簇因子的值。
可以通過(guò)如下的命令顯式地設(shè)置聚簇因子的值:
EXECDBMS_STATS.SET_INDEX_STATS(OWNNAME=>'LHR',INDNAME=>'IND2',CLSTFCT=>400000000,NO_INVALIDATE=>FALSE);
CF值可以通過(guò)查詢(xún)視圖DBA_INDEXES中的CLUSTERING_FACTOR列來(lái)獲取。下邊的SQL是查詢(xún)索引的相關(guān)信息,通過(guò)視圖DBA_INDEXES、DBA_OBJECTS和DBA_TABLES關(guān)聯(lián)得到,可以查詢(xún)當(dāng)前索引的大小、行數(shù)、創(chuàng)建日期、索引高度和聚簇因子等信息。[考點(diǎn)]索引
12.
什么是索引的選擇性(IndexSelectivity)?正確答案:索引的選擇性(Indexselectivity,索引的選擇度或索引的選擇率)是指索引列中不同值的記錄數(shù)與表中總記錄數(shù)的比值。索引的選擇性的取值范圍是[0,1]。例如,某個(gè)表的記錄數(shù)是1000條,而該表的索引列的值只有900個(gè)不同的值(有100個(gè)是相同或者空),所以,該列索引的選擇性為900/1000=0.9。對(duì)于索引的選擇性,值越高表示該列索引的效率也就越高??梢允褂萌缦碌腟QL來(lái)計(jì)算索引的選擇性:
SELECTCOUNT(DISTINCTNAME)/COUNT(*)FROMTB_A;
這種方法的優(yōu)點(diǎn)是在創(chuàng)建索引前就能評(píng)估索引的選擇性。當(dāng)索引被收集了最新的統(tǒng)計(jì)信息時(shí),可以使用如下的SQL語(yǔ)句查詢(xún)索引的選擇性:
SELECTINDEX_NAME,DISTINCT_KEYS/NUM_ROWSSELECTIVEITYFROMDBA_INDEXES;
毋庸置疑,主鍵的選擇性為1。選擇性越接近1,那么該索引就越好。[考點(diǎn)]索引
13.
哪幾種情況不能使用索引?正確答案:有多種原因會(huì)導(dǎo)致索引不能被使用。首要的原因就是統(tǒng)計(jì)信息不準(zhǔn),第二原因就是索引的選擇度不高,使用索引比使用全表掃描效率更差。還有一個(gè)比較常見(jiàn)的原因,就是對(duì)索引列進(jìn)行了函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式等操作,或出現(xiàn)隱式類(lèi)型轉(zhuǎn)換,導(dǎo)致無(wú)法使用索引。還有很多其他原因會(huì)導(dǎo)致不能使用索引,這個(gè)問(wèn)題在MOS(MOS即MyOracleSupport)“文檔1549181.1為何在查詢(xún)中索引未被使用”中有非常詳細(xì)的解釋。詳細(xì)情況見(jiàn)下表。分類(lèi)原因解釋快速檢查表上是甭存在索引檢查那些認(rèn)為應(yīng)該通過(guò)索引訪(fǎng)問(wèn)的表上是否真的創(chuàng)建了索引。那些索引可能已經(jīng)被刪掉或者在創(chuàng)建的時(shí)候就失敗了。例如,一種可能的場(chǎng)景是,在對(duì)表做導(dǎo)入操作后,由于軟件或人為錯(cuò)誤造成索引沒(méi)有被創(chuàng)建。通過(guò)DBA_INDEXES視圖可以檢查索引是否存在索引是否應(yīng)該被使用Oracle不會(huì)僅僅因?yàn)橛兴饕嬖诰鸵欢ㄒ褂盟饕?。如果一個(gè)查詢(xún)需要檢索出這個(gè)表里所有的記錄,那么只需要單獨(dú)訪(fǎng)問(wèn)表的數(shù)據(jù)會(huì)更快。對(duì)所有的查詢(xún)而言,Oracle優(yōu)化器會(huì)基于統(tǒng)計(jì)信息來(lái)計(jì)算各種訪(fǎng)問(wèn)路徑,包括索引,從而選出最優(yōu)的一條路徑索引本身的問(wèn)題索引的索引列是否在WHERE條件中(PredicateList)對(duì)于單列索引而言,只有當(dāng)索引列出現(xiàn)在查詢(xún)的WHERE條件中時(shí),Oracle才能使用到索引。對(duì)于組合索引而言,如果索引的前置列沒(méi)有出現(xiàn)在WHERE條件中,而是用到了組合索引的其他索引列,那么這時(shí)候Oracle可能會(huì)選擇索引跳躍掃描(IndexSkipScan,INDEX_SS)或不會(huì)選擇索引掃描索引列是否用在連接謂詞中(JoinPredicates)如果索引列是連接謂詞的一部分,那么需要查看使用了哪種類(lèi)型的連接方式?在兩張表連接中,且內(nèi)表的目標(biāo)列上建有索引時(shí),只有NL連接才能有效地利用到該索引。SMJ即使相關(guān)列上建有索引,最多只能因索引的存在,避免數(shù)據(jù)排序過(guò)程。HJ由于須做HASH運(yùn)算,索引的存在對(duì)數(shù)據(jù)查詢(xún)速度幾乎沒(méi)有影響連接順序(JoinOrder)是否允許使用索引查看連接順序(JoinOrder)是否允許使用相關(guān)索引。假設(shè)表A的ID列上有索引,表B的列ID上無(wú)索引,WHERE語(yǔ)句有A.ID=B.ID條件,并且查詢(xún)中沒(méi)有與A.ID相關(guān)的其他謂詞。在做NL連接時(shí),表A作為外部表,先被訪(fǎng)問(wèn),由于連接機(jī)制原因,外部表的數(shù)據(jù)訪(fǎng)問(wèn)方式是全表掃描,A.ID上的索引顯然是用不上索引列是否在IN或者多個(gè)OR語(yǔ)句中如果索引列在IN或OR子句中,那么查詢(xún)可能已經(jīng)被轉(zhuǎn)化為不能使用索引的語(yǔ)句是否對(duì)索引列進(jìn)行了函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式等操作應(yīng)盡量避免在WHERE子句中對(duì)索引字段進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式等操作,因?yàn)檫@樣可能會(huì)使索引失效,查詢(xún)時(shí)要盡可能將操作移至等號(hào)右邊索引列是否出現(xiàn)了隱式類(lèi)型轉(zhuǎn)換(ImplicitTypeConversion)如果進(jìn)行比較的兩個(gè)值的數(shù)據(jù)類(lèi)型不同,那么Oracle必須將其中一個(gè)值進(jìn)行類(lèi)型轉(zhuǎn)換使其能夠比較,這就是所謂的隱式類(lèi)型轉(zhuǎn)換。通常當(dāng)開(kāi)發(fā)人員將數(shù)字存儲(chǔ)在字符列時(shí)會(huì)導(dǎo)致這種問(wèn)題的產(chǎn)生。Oracle在運(yùn)行時(shí)會(huì)在索引字符列使用TO_NUMBER函數(shù)強(qiáng)制轉(zhuǎn)化字符類(lèi)型為數(shù)值類(lèi)型。由于添加函數(shù)到索引列,導(dǎo)致索引不被使用。實(shí)際上,Oracle也只能這么做,類(lèi)型轉(zhuǎn)換是一個(gè)應(yīng)用程序設(shè)計(jì)因素。由于轉(zhuǎn)換是在每行都進(jìn)行的,這會(huì)導(dǎo)致性能問(wèn)題。一般情況下,當(dāng)比較不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)時(shí),Oracle自動(dòng)地從復(fù)雜向簡(jiǎn)單的數(shù)據(jù)類(lèi)型轉(zhuǎn)換。所以,字符類(lèi)型的字段值應(yīng)該加上引號(hào)是否在語(yǔ)義(semantically)上無(wú)法使用索引出于對(duì)查詢(xún)整體成本的考慮,一個(gè)成本較低的執(zhí)行計(jì)劃中可能是無(wú)法使用索引的。某索引可能已經(jīng)被考慮在某種連接排序及方法中,但是成本最低的那個(gè)執(zhí)行計(jì)劃中卻無(wú)法從“語(yǔ)義”角度使用該索引(續(xù))分類(lèi)原因解釋索引本身的問(wèn)題錯(cuò)誤類(lèi)型的索引掃描可以定義索引的排序順序?yàn)檫f增或遞減。Oracle對(duì)待降序索引就好像它是基于函數(shù)的索引,因此與默認(rèn)使用的升序的執(zhí)行計(jì)劃不同。通過(guò)查看執(zhí)行計(jì)劃是看不到使用升序或降序的,需要額外檢查視圖DBA_IND_COLUMNS的DESCEND列。如果系統(tǒng)中經(jīng)常使用索引范圍掃描進(jìn)行讀取數(shù)據(jù)(例如在WHERE子句中使用“BETWEENAND”語(yǔ)句或比較運(yùn)算符“>”“<”“>=”“<=”等),那么反向鍵索引將不會(huì)被使用,此時(shí)Oracle會(huì)選擇全表掃描。只有對(duì)反向鍵索引列進(jìn)行“=”操作時(shí),其反向鍵索引才會(huì)使用索引列是否可以為空除了聯(lián)合索引(即多列索引)和位圖索引外,其他索引都不存儲(chǔ)NULL值。只有至少有一個(gè)索引列有值,聯(lián)合索引才存儲(chǔ)空值。聯(lián)合索引中尾部的空值也會(huì)被存放在索引中。如果所有列的值都為空,這行將不會(huì)存儲(chǔ)在索引中。由于索引中缺乏NULL值,那么一些結(jié)果中可能會(huì)返回NULL值(例如,COUNT)的操作可能會(huì)被禁用索引。這是因?yàn)閮?yōu)化器不能保證在單獨(dú)使用索引時(shí)可以獲得準(zhǔn)確的信息。位圖索引允許存儲(chǔ)空值。因此,無(wú)論它們的結(jié)果可信與否,優(yōu)化器都會(huì)使用這些索引NLS_SORT是否設(shè)置為二進(jìn)制(BINARY)如果NLS_SORT未設(shè)置為二進(jìn)制,索引將不會(huì)被使用。這是因?yàn)樗饕腔贙ey值的二進(jìn)制順序來(lái)建立的(pre-sorted使用二進(jìn)制值)。無(wú)論優(yōu)化器設(shè)置為何種方法,當(dāng)NLS_SORT不是二進(jìn)制時(shí),將使用全表掃描是否使用的是不可見(jiàn)索引(InvisibleIndexes)從Oracle11gR1開(kāi)始,可以創(chuàng)建不可見(jiàn)索引或?qū)⒁粋€(gè)已經(jīng)存在的索引標(biāo)記為不可見(jiàn)。如果在SESSION或SYSTEM級(jí)別將參數(shù)OPTIMIZER_USE_INVISIBLE_INDEXES設(shè)置為T(mén)RUE(默認(rèn)為FALSE,表示Oracle優(yōu)化器不會(huì)考慮不可見(jiàn)索引),那么Oracle優(yōu)化器就會(huì)考慮不可見(jiàn)索引。無(wú)論該參數(shù)的值為T(mén)RUE還是FALSE,DML操作還是會(huì)維護(hù)這些不可見(jiàn)索引的優(yōu)化器和成本計(jì)算相關(guān)問(wèn)題是否存在準(zhǔn)確且合適的統(tǒng)計(jì)信息(Statistics)CBO依賴(lài)于準(zhǔn)確的、最新的和完整的統(tǒng)計(jì)信息來(lái)確定一個(gè)特定查詢(xún)的最佳執(zhí)行計(jì)劃。如果使用CBO,需確保統(tǒng)計(jì)信息已經(jīng)收集。如果沒(méi)有統(tǒng)計(jì)信息,CBO將使用預(yù)定義的統(tǒng)計(jì)信息,這樣很可能不會(huì)產(chǎn)生良好的計(jì)劃或讓?xiě)?yīng)用程序使用索引。請(qǐng)注意,CBO會(huì)根據(jù)開(kāi)銷(xiāo)(COST)來(lái)決定使用不同的索引。除了基本的表和索引的信息之外,如果在某些列上數(shù)據(jù)分布是不均勻的,那么還需要收集這些列的數(shù)據(jù)的分布情況,即直方圖。一般情況下,對(duì)象的數(shù)據(jù)或結(jié)構(gòu)的改變會(huì)使以前的統(tǒng)計(jì)信息不準(zhǔn)確,因此應(yīng)該重新收集新的統(tǒng)計(jì)信息。例如,對(duì)表裝載了大量的數(shù)據(jù)后,需要收集新的統(tǒng)計(jì)信息。安裝新補(bǔ)丁集(Patchset)后,也建議重新收集統(tǒng)計(jì)信息。表訪(fǎng)問(wèn)最佳效果是統(tǒng)計(jì)信息在相同版本的數(shù)據(jù)庫(kù)中生成的一個(gè)索引是否與其他的索引有相同的等級(jí)或者成本(Cost)對(duì)于相同開(kāi)銷(xiāo)(COST)的索引,CBO會(huì)使用多種辦法將不同的索引區(qū)分開(kāi),如將索引名稱(chēng)按字母順序排序,完全匹配的索引掃描會(huì)選擇更大的NDK(不同鍵值的個(gè)數(shù))的索引(不適用于快速全掃描)或選擇葉塊數(shù)量較少的索引索引的選擇度是否不高CBO會(huì)假定列數(shù)據(jù)不會(huì)傾斜,并均勻分布。如果數(shù)據(jù)分布不是這種情況,那么統(tǒng)計(jì)信息可能沒(méi)有反映真實(shí)情況,即使某些值的選擇度高,索引也會(huì)因?yàn)檎麄€(gè)列的選擇度不高而不使用索引。如果是這種情況,那么應(yīng)考慮采用直方圖記錄更準(zhǔn)確的列的數(shù)據(jù)分布或者采用提示(Hint)在總體成本中,表掃描的成本是否占大部分通常來(lái)說(shuō),當(dāng)使用索引的時(shí)候,需要再次檢索表本身來(lái)找到索引中不存在的字段的值(索引回表讀),這個(gè)操作比檢索索引本身的開(kāi)銷(xiāo)要大很多。由于優(yōu)化器是基于總體的成本來(lái)計(jì)算執(zhí)行計(jì)劃的,如果通過(guò)索引檢索表的成本很大,并且超過(guò)了某個(gè)閥值,優(yōu)化器就會(huì)考慮其他的訪(fǎng)問(wèn)路徑。優(yōu)化器(Optimizer)使用聚簇因子(ClusteringFactor)來(lái)判斷若使用索引的話(huà)需要對(duì)表做多少次訪(fǎng)問(wèn),因此當(dāng)索引的聚簇因子很大的時(shí)候Oracle會(huì)選擇全表掃描訪(fǎng)問(wèn)空索引并不意味著比訪(fǎng)問(wèn)有值的索引高效重組、TRUNCATE或DELETE操作不一定會(huì)影響SQL語(yǔ)句執(zhí)行的成本。需要注意的是,刪除操作并不會(huì)從對(duì)象中真正釋放空間。也就是說(shuō),DELETE操作不會(huì)重置對(duì)象的高水位。TRUNCATE操作會(huì)重黃高水位??諌K的存在會(huì)使索引和表掃描的成本比實(shí)際應(yīng)該的成本高參數(shù)設(shè)置是否正確某些參數(shù)的設(shè)置可能會(huì)影響索引的使用。比如在大多數(shù)情況下都建議使用DB_FILE_MULTIBLOCK_READ_COUNT和OPTIMIZER_INDEX_COST_ADJ的默認(rèn)值。除非某些特定的操作有特定的建議,使用其他值會(huì)使索引的成本不現(xiàn)實(shí)地減少或變大,從而極大地降低查詢(xún)的性能其他問(wèn)題是否存在遠(yuǎn)程表(RemoteTable)通常遠(yuǎn)程表不會(huì)使用索引。索引在分布式查詢(xún)中的使用依賴(lài)于被發(fā)送到遠(yuǎn)程的查詢(xún)。CBO將評(píng)估遠(yuǎn)程訪(fǎng)問(wèn)的成本,并評(píng)估比較發(fā)送或者不發(fā)送索引的謂詞到遠(yuǎn)程站點(diǎn)的成本。因此,CBO可以做出有關(guān)遠(yuǎn)程表上使用索引的更加明智的決定。一種非常有效的方法就是,在遠(yuǎn)程建立包含相關(guān)謂詞的視圖并強(qiáng)制使用索引,之后在本地查詢(xún)中使用這個(gè)視圖是否使用了并行執(zhí)行(PX)在并行執(zhí)行時(shí)索引的采用比在串行執(zhí)行(SerialExecution)時(shí)更加嚴(yán)格。一種快速檢測(cè)的方法就是禁用并行,然后查看該索引是否被使用。并行查詢(xún)將不會(huì)用到索引是否包含了子查詢(xún)的UPDATE語(yǔ)句在一些情況下,基于成本的考慮,索引沒(méi)有被使用是因?yàn)樗蕾?lài)于一個(gè)子查詢(xún)返回的值。這種情況下,可以使用提示(Hint)來(lái)強(qiáng)制使用索引查詢(xún)是否使用了綁定變量CBO對(duì)LIKE或范圍謂詞的綁定變量不能產(chǎn)生準(zhǔn)確的成本,或綁定變量窺探操作都可能會(huì)導(dǎo)致索引不被選擇查詢(xún)是否引用了帶有延遲約束的列如果一個(gè)表中的某一列上含有延遲約束(比如NOTNULL)并且這一列上有索引,那么不管這個(gè)約束當(dāng)前是延遲狀態(tài)或者被顯式地設(shè)置為立即使用,Oracle都不會(huì)考慮使用這一列上的索引索引提示(Hint)是否不工作語(yǔ)法不正確、使用了RBO、Hint的對(duì)象名不正確、使用了非空索引列來(lái)計(jì)算行數(shù)等情況都可能導(dǎo)致索引提示不工作(續(xù))分類(lèi)原因解釋其他問(wèn)題索引列是否使用了前置通配符(%)在WHERE子句中,如果索引列所對(duì)應(yīng)的值的第一個(gè)字符由通配符(WILDCARD)開(kāi)始,索引將不被采用索引列是否使用了非等值連接符應(yīng)盡量避免在WHERE子句中使用!=或<>操作符,否則引擎將放棄使用索引而進(jìn)行全表掃描??梢酝ㄟ^(guò)改寫(xiě)為IN或UNIONALL來(lái)使用索引是否在WHERE子句中對(duì)索引列進(jìn)行了ISNULL值判斷應(yīng)盡量避免在WHERE子句中對(duì)字段進(jìn)行ISNULL值判斷,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描??梢酝ㄟ^(guò)加偽列創(chuàng)建偽聯(lián)合索引來(lái)使得ISNULL使用索引查詢(xún)轉(zhuǎn)換失敗,走不了索引查詢(xún)轉(zhuǎn)換是非常復(fù)雜的過(guò)程,OracleCBO的查詢(xún)轉(zhuǎn)換有子查詢(xún)展開(kāi)、視圖合并、星型轉(zhuǎn)換、連接謂詞推入、表擴(kuò)展等。如果查詢(xún)轉(zhuǎn)換失敗,那么必將影響后續(xù)優(yōu)化器的一些操作,比如JPPD中JOIN謂詞無(wú)法推入視圖中,那么很可能視圖就無(wú)法選擇索引了。另外,查詢(xún)轉(zhuǎn)換有很多BUG,若觸發(fā)BUG則需要找到原因,比如設(shè)置隱含參數(shù)、fixcontrol,或者改寫(xiě)SQL繞過(guò)BUG等是否使用了視圖或子查詢(xún)查詢(xún)涉及視圖或者子查詢(xún)時(shí)可能會(huì)被改寫(xiě),導(dǎo)致不使用索引(盡管該改寫(xiě)的目標(biāo)之一是擴(kuò)展更多的訪(fǎng)問(wèn)路徑)。這些改寫(xiě)(Rewrite)一般來(lái)說(shuō)都是合并(Merging)操作
建議讀者對(duì)每種類(lèi)型的情況都做實(shí)驗(yàn),以便加深理解和印象。
14.
ISNULL如何用到索引?正確答案:ISNULL用于判斷某一列中的值是否為空。當(dāng)ISNULL作為WHERE條件的時(shí)候,該列是不會(huì)用到索引的,但是可以加偽列創(chuàng)建偽聯(lián)合索引來(lái)使得ISNULL使用索引。[考點(diǎn)]索引
15.
模糊查詢(xún)可以使用索引嗎?正確答案:可以分為以下幾種情況:
1)若SELECT子句只檢索索引字段,那么模糊查詢(xún)可以使用索引,例如,“SELECTIDFROMTBWHEREIDLIKE'%123%';”可以使用索引。
2)若SELECT子句不只檢索索引字段還檢索其他非索引字段,那么分為以下幾種情況:
①模糊查詢(xún)形如“WHERECOL_NAMELIKE'ABC%';”可以用到索引。
②模糊查詢(xún)形如“WHERECOL_NAMELIKE'%ABC';”不能使用索引,但是可以通過(guò)REVERSE函數(shù)來(lái)創(chuàng)建函數(shù)索引才能使用到索引。
③模糊查詢(xún)形如“WHERECOL_NAMELIKE'%ABC%';”不能使用索引,但是,如果所查詢(xún)的字符串有一定的規(guī)律,那么還是可以使用到索引的,分以下幾種情況:
a.如果字符串ABC始終從原字符串的某個(gè)固定位置出現(xiàn),那么可以創(chuàng)建SUBSTR函數(shù)索引進(jìn)行優(yōu)化。
b.如果字符串ABC始終從原字符串結(jié)尾的某個(gè)固定位置出現(xiàn),那么可以創(chuàng)建函數(shù)組合索引進(jìn)行優(yōu)化。
c.如果字符串ABC在原字符串中位置不固定,那么可以通過(guò)改寫(xiě)SQL進(jìn)行優(yōu)化。改寫(xiě)的方法主要是通過(guò)先使用子查詢(xún)查詢(xún)出需要的字段,然后在外層嵌套,這樣就可以使用到索引了。
④建全文索引后使用CONTAINS也可以用到域索引。
16.
Hint是什么?正確答案:Oracle的Hint是用來(lái)提示Oracle的優(yōu)化器,用來(lái)選擇用戶(hù)期望的執(zhí)行計(jì)劃。Oracle推出了一個(gè)隱含參數(shù)“_OPTIMIZER_IGNORE_HINTS”,其取值為T(mén)RUE或FALSE,默認(rèn)值是FALSE。Oracle可以通過(guò)將該隱含參數(shù)設(shè)置為T(mén)RUE,使得Oracle優(yōu)化器忽略語(yǔ)句中所有的Hint。顯然,Oracle提供此參數(shù)的目的是在不修改應(yīng)用的前提下,忽略所有Hint,讓Oracle優(yōu)化器自己來(lái)選擇執(zhí)行路徑。[考點(diǎn)]Hint
17.
NOLOGGING是一種Hint嗎?正確答案:下面幾條SQL都是使用NOLOGGING時(shí)的錯(cuò)誤用法:
INSERTINTOT1NOLOGGING;
INSERTINTOT1SELECT*FROMT2NOLOGGING;
INSERT/*+NOLOGGING*/INTOT1VALUES('0');
INSERT/*+NOLOGGING*/INTOT1SELECT*FROMT2;
DELETE/*+NOLOGGING*/FROMT1;
UPDATE/*+NOLOGGING*/T1SETA='1';
實(shí)際上,上述所有的SQL沒(méi)有一個(gè)能夠?qū)崿F(xiàn)“不產(chǎn)生”日志的數(shù)據(jù)更改操作。事實(shí)上,NOLOGGING并不是Oracle的一個(gè)有效的Hint,而是一個(gè)SQL關(guān)鍵字,通常用于DDL語(yǔ)句中。這里NOLOGGING相當(dāng)于給SELECT的表指定了一個(gè)別名為“NOLOGGING”。下面是NOLOGGING的一些正確用法:
CREATETABLET1NOLOGGINGASSELECT*FROMT2;
CREATEINDEXT1_IDXONT1(A)NOLOGGING;
ALTERINDEXT1_IDXREDUILDONLINENOLOGGING;
ALTERTABLET1NOLOGGING;
若面試官問(wèn)如何強(qiáng)制一個(gè)SQL語(yǔ)句使用索引,此時(shí)就可以回答使用Hint,/*+INDEX(TABLEINDEX_NAME)*/來(lái)完成。[考點(diǎn)]Hint
18.
OracleHint中的DRIVING_SITE的作用是什么?正確答案:日常工作中經(jīng)常會(huì)用到分布式數(shù)據(jù)庫(kù)查詢(xún),即通過(guò)DBLINK同時(shí)查詢(xún)本地表和遠(yuǎn)程表。分布式查詢(xún)一般有兩種處理方式:一種將遠(yuǎn)程表數(shù)據(jù)取回本地,然后和本地表關(guān)聯(lián)查詢(xún),獲取最終結(jié)果;另一種將本地表數(shù)據(jù)傳到遠(yuǎn)程和遠(yuǎn)程表關(guān)聯(lián)查詢(xún)后,再將關(guān)聯(lián)結(jié)果取回。前一種處理方式可理解為只有一次網(wǎng)絡(luò)傳輸操作,比后一種少,也就作為了數(shù)據(jù)庫(kù)的默認(rèn)處理方式。DRIVING_SITE提示能夠指定執(zhí)行計(jì)劃在遠(yuǎn)程還是本地做,使用DRIVING_SITE,特別是本地小結(jié)果集,遠(yuǎn)程大結(jié)果集,最終結(jié)果集較小時(shí),希望計(jì)劃在遠(yuǎn)程驅(qū)動(dòng),這樣遠(yuǎn)程執(zhí)行完畢,將結(jié)果集傳輸?shù)奖镜兀苊饬舜蠼Y(jié)果集的網(wǎng)絡(luò)傳輸,從而達(dá)到整體優(yōu)化的效果。使用DRIVING_SITE可以減少總體的網(wǎng)絡(luò)傳輸數(shù)據(jù)量。
當(dāng)DRWING_SITE驅(qū)動(dòng)的對(duì)象嵌套在視圖中時(shí),可通過(guò)DRIVING_SITE(V.T)方式來(lái)指定,其中,V表示視圖別名或名稱(chēng),T表示視圖里表的別名或名稱(chēng)。
需要注意的是,對(duì)于DML和DDL語(yǔ)句,DRIVING_SITE提示是失效的,會(huì)自動(dòng)被Oracle忽略掉,此時(shí)將以目標(biāo)表所在庫(kù)為主計(jì)劃驅(qū)動(dòng),相當(dāng)于DRIVING_SITE(目標(biāo)表庫(kù)),此時(shí)可以通過(guò)視圖轉(zhuǎn)換來(lái)達(dá)到優(yōu)化的目的。DML和DDL中如果是對(duì)本地表做DML,主計(jì)劃總是在本地執(zhí)行,會(huì)將遠(yuǎn)程數(shù)據(jù)拉到本地,相當(dāng)于DRIVING_SITE(本地表)。如果是對(duì)遠(yuǎn)程表做DML,那么主計(jì)劃總是在遠(yuǎn)程執(zhí)行,會(huì)將本地?cái)?shù)據(jù)送到遠(yuǎn)程,相當(dāng)于自動(dòng)DRIVING_SITE(遠(yuǎn)程表)。[考點(diǎn)]Hint
19.
Oracle數(shù)據(jù)庫(kù)中庫(kù)緩存(LibraryCache)的作用有哪些?正確答案:庫(kù)緩存是SGA中共享池(SharedPool)中的一塊內(nèi)存區(qū)域,主要作用就是緩存執(zhí)行過(guò)的SQL語(yǔ)句和PL/SQL語(yǔ)句(例如存儲(chǔ)過(guò)程、函數(shù)、包、觸發(fā)器)及其所對(duì)應(yīng)的解析樹(shù)(ParseTree)和執(zhí)行計(jì)劃等信息。當(dāng)同樣的SQL語(yǔ)句和PL/SQL語(yǔ)句再次被執(zhí)行的時(shí)候就可以直接利用已經(jīng)緩存在庫(kù)緩存中的那些相關(guān)對(duì)象而無(wú)須再次從頭開(kāi)始解析,這樣就提高了這些SQL語(yǔ)句和PL/SQL語(yǔ)句在重復(fù)執(zhí)行時(shí)的執(zhí)行效率。庫(kù)緩存在SGA中的位置如下圖所示。
[考點(diǎn)]游標(biāo)
20.
游標(biāo)分為哪幾類(lèi)?父游標(biāo)和子游標(biāo)的區(qū)別是什么?正確答案:游標(biāo)(Cursor)是Oracle數(shù)據(jù)庫(kù)中SQL解析和執(zhí)行的載體,它可以分為共享游標(biāo)(SharedCursor)和會(huì)話(huà)游標(biāo)(SessionCursor)。共享游標(biāo)是指緩存在庫(kù)緩存(LibraryCache)里的一種庫(kù)緩存對(duì)象,其實(shí)就是指緩存在庫(kù)緩存里的SQL語(yǔ)句和匿名PL/SQL塊所對(duì)應(yīng)的庫(kù)緩存對(duì)象。共享游標(biāo)是Oracle緩存在庫(kù)緩存中的幾十種庫(kù)緩存對(duì)象之一,它所對(duì)應(yīng)的庫(kù)緩存對(duì)象句柄的Namespace屬性的值是CRSR(也就是Cursor的縮寫(xiě))。共享游標(biāo)會(huì)存儲(chǔ)目標(biāo)SQL的SQL文本、解析樹(shù)、該SQL所涉及的對(duì)象定義、該SQL所使用的綁定變量類(lèi)型和長(zhǎng)度,以及該SQL的執(zhí)行計(jì)劃等信息。共享游標(biāo)可以細(xì)分為父游標(biāo)(ParentCursor)和子游標(biāo)(ChildCursor),可以通過(guò)視圖V$SQLAREA來(lái)查看當(dāng)前緩存在庫(kù)緩存(LibraryCache)中的父游標(biāo),而通過(guò)V$SQL來(lái)查看緩存在庫(kù)緩存中的子游標(biāo)。Oracle設(shè)計(jì)這種嵌套的ParentCursor和ChildCursor并存的結(jié)構(gòu)是為了能盡量減少對(duì)應(yīng)的HashBucket中庫(kù)緩存對(duì)象句柄鏈表的長(zhǎng)度。
Oracle中游標(biāo)的分類(lèi)如下圖所示。
父游標(biāo)和子游標(biāo)的對(duì)比見(jiàn)下表。
父游標(biāo)子游標(biāo)查詢(xún)視圖V$SQLAREAV$SQL存儲(chǔ)內(nèi)容父游標(biāo)存儲(chǔ)SQL文本(庫(kù)緩存對(duì)象句柄的屬性NAME中);父游標(biāo)的heap0中存儲(chǔ)著子游標(biāo)的句柄地址子游標(biāo)存儲(chǔ)解析樹(shù)(ParseTlree)及執(zhí)行計(jì)劃(ExecutionPlan,實(shí)際上存儲(chǔ)在庫(kù)緩存對(duì)象句柄的heap6中),以及該SQL所使用的綁定變量的類(lèi)型和長(zhǎng)度庫(kù)緩存對(duì)象句柄的屬性NAME存儲(chǔ)內(nèi)容存儲(chǔ)SQL文本空聯(lián)系1)父游標(biāo)和子游標(biāo)的結(jié)構(gòu)是一樣的,它們都是以庫(kù)緩存對(duì)象句柄的方式緩存在厙緩存中,Namespace屬性的值均為CRSR2)由于子游標(biāo)所對(duì)應(yīng)的庫(kù)緩存對(duì)象句柄的NAME屬性值為空,所以,只能通過(guò)父游標(biāo)才能找到相應(yīng)的子游標(biāo)3)任意一個(gè)經(jīng)過(guò)解析的目標(biāo)SQL一定會(huì)同時(shí)對(duì)應(yīng)兩個(gè)共享游標(biāo),一個(gè)是父游標(biāo),另一個(gè)則是子游標(biāo)[考點(diǎn)]游標(biāo)
21.
會(huì)話(huà)游標(biāo)的含義是什么?共享游標(biāo)和會(huì)話(huà)游標(biāo)的區(qū)別有哪些?正確答案:會(huì)話(huà)游標(biāo)(SessionCursor)是當(dāng)前會(huì)話(huà)(Session)解析和執(zhí)行SQL的載體,即會(huì)話(huà)游標(biāo)用于在當(dāng)前會(huì)話(huà)中解析和執(zhí)行SQL,會(huì)話(huà)游標(biāo)是以哈希表的方式緩存在PGA中(共享游標(biāo)是緩存在SGA的庫(kù)緩存里)。在目標(biāo)SQL的執(zhí)行過(guò)程中,會(huì)話(huà)游標(biāo)起承上啟下的作用。因?yàn)镺racle依靠會(huì)話(huà)游標(biāo)來(lái)將目標(biāo)SQL所涉及的數(shù)據(jù)從BufferCache的對(duì)應(yīng)數(shù)據(jù)塊讀到PGA里,然后在PGA里做后續(xù)的排序、表連接等處理,最后將最終的處理結(jié)果返回給用戶(hù),所以,會(huì)話(huà)游標(biāo)是當(dāng)前會(huì)話(huà)解析和執(zhí)行SQL的載體。
共享游標(biāo)和會(huì)話(huà)游標(biāo)的對(duì)比見(jiàn)下表。
共享游標(biāo)會(huì)話(huà)游標(biāo)緩存位置緩存在SGA中的共享池里的庫(kù)緩存中緩存在每個(gè)會(huì)話(huà)的PGA中共享共享游標(biāo)在所有會(huì)話(huà)之間共享會(huì)話(huà)游標(biāo)與會(huì)話(huà)是一一對(duì)應(yīng)的,不同會(huì)話(huà)的會(huì)話(huà)游標(biāo)之間不能共享,這是與共享游標(biāo)的本質(zhì)區(qū)別。生命周期共享游標(biāo)無(wú)生命周期,會(huì)進(jìn)行緩存會(huì)話(huà)游標(biāo)是有生命周期的,每個(gè)會(huì)話(huà)游標(biāo)在使用的過(guò)程中都至少會(huì)經(jīng)歷一次Open、Parse、Bind、Execute、Fetch和Close中的一個(gè)或多個(gè)階段。Oracle會(huì)根據(jù)參數(shù)SESSION_CACHED_CURSORS的值來(lái)決定是否將已經(jīng)用過(guò)的會(huì)話(huà)游標(biāo)緩存在對(duì)應(yīng)會(huì)話(huà)的PGA中聯(lián)系1)會(huì)話(huà)游標(biāo)足以哈希表的方式緩存在PGA中,意味著Oracle會(huì)通過(guò)棚關(guān)的哈希運(yùn)算來(lái)存儲(chǔ)和訪(fǎng)問(wèn)在當(dāng)前會(huì)話(huà)的PGA中的對(duì)應(yīng)會(huì)話(huà)游標(biāo)。這種訪(fǎng)問(wèn)機(jī)制和共享游標(biāo)是一樣的,可以簡(jiǎn)單地認(rèn)為Oracle是根據(jù)目標(biāo)SQL的SQL文本的哈希值去PGA中的相應(yīng)HashBucket中找匹配的會(huì)話(huà)游標(biāo)。由于在緩存會(huì)話(huà)游標(biāo)的哈希表的對(duì)應(yīng)HashBucket中,Oracle會(huì)存儲(chǔ)目標(biāo)SQL對(duì)應(yīng)的父游標(biāo)的庫(kù)緩存對(duì)象句柄地址,所以,Oracle可以通過(guò)會(huì)話(huà)游標(biāo)找到對(duì)應(yīng)的父游標(biāo),進(jìn)而就可以找到對(duì)應(yīng)子游標(biāo)中目標(biāo)SQL的解析樹(shù)和執(zhí)行計(jì)劃,然后Oracle就可以重用目標(biāo)SQL的解析樹(shù)和執(zhí)行計(jì)劃來(lái)執(zhí)行SQL語(yǔ)句了2)一個(gè)會(huì)話(huà)游標(biāo)只能對(duì)應(yīng)一個(gè)共享游標(biāo),而一個(gè)共享游標(biāo)卻可以同時(shí)對(duì)應(yīng)多個(gè)會(huì)話(huà)游標(biāo)[考點(diǎn)]游標(biāo)
22.
會(huì)話(huà)游標(biāo)分為哪幾類(lèi)?正確答案:會(huì)話(huà)游標(biāo)的詳細(xì)分類(lèi)參考下表。
在上表中需要注意的是,動(dòng)態(tài)游標(biāo)是Oracle數(shù)據(jù)庫(kù)中最靈活的一種會(huì)話(huà)游標(biāo),它的靈活性表現(xiàn)在:①動(dòng)態(tài)游標(biāo)的定義方式非常靈活,它可以有多種定義方式;②動(dòng)態(tài)游標(biāo)可以作為存儲(chǔ)過(guò)程的輸入?yún)?shù)和函數(shù)的輸出參數(shù)。上表中的各種游標(biāo)希望讀者可以通過(guò)做大量的練習(xí)題來(lái)掌握,畢竟游標(biāo)是存儲(chǔ)過(guò)程開(kāi)發(fā)過(guò)程中必不可少的內(nèi)容。[考點(diǎn)]游標(biāo)
23.
會(huì)話(huà)游標(biāo)有哪些屬性?正確答案:會(huì)話(huà)游標(biāo)有4個(gè)屬性,見(jiàn)下表。屬性類(lèi)型簡(jiǎn)介適用對(duì)象適用SQLSQL%FOUND布爾型最近的FETCH是否提取到數(shù)據(jù),表示一條SQL語(yǔ)句被執(zhí)行成功后受其影響而改變的記錄數(shù)是否大于或等于1,若是則賦值為T(mén)RUE,否則為FALSE。在一條DML語(yǔ)句被執(zhí)行前,SQL%FOUND的值是NULL隱式游標(biāo)、顯式游標(biāo)INSERT、DELETE、UPDATE、SELECT...INTO...SQL%NOTFOUND布爾型最近的FETCH是否沒(méi)有提取到數(shù)據(jù),表示一條SQL語(yǔ)句被執(zhí)行成功后受其影響而改變的記錄數(shù)是否為0,若是則賦值為T(mén)RUE,否則為FALSE。在一條DML語(yǔ)句被執(zhí)行前,SQL%NOTFOUND的值是NULL隱式游標(biāo)、顯式游標(biāo)SQL%ROWCOUNT數(shù)值型表示最近的一條SQL語(yǔ)句成功執(zhí)行后受其影響而改變的記錄的數(shù)最,后續(xù)執(zhí)行的SQL會(huì)覆蓋SQL%ROWCOUNT的值隱式游標(biāo)、顯式游標(biāo)SQL%ISOPEN布爾型游標(biāo)是否打開(kāi),當(dāng)游標(biāo)打開(kāi)時(shí)返回TRUE。對(duì)于隱式游標(biāo)而言,SQL%ISOPEN的值永遠(yuǎn)是FALSE顯式游標(biāo)
當(dāng)執(zhí)行一條DML語(yǔ)句后,DML語(yǔ)句的結(jié)果保存在這4個(gè)游標(biāo)屬性中,這些屬性用于控制程序流程或者了解程序的狀態(tài)。當(dāng)運(yùn)行DML語(yǔ)句時(shí),PL/SQL打開(kāi)一個(gè)內(nèi)建游標(biāo)并處理結(jié)果。在這些屬性中,SQL%FOUND和SOL%NOTFOUND是布爾值,SQL%ROWCOUNT是整數(shù)值。需要注意的是,若游標(biāo)屬于隱式游標(biāo),則在PL/SOL中可以直接使用上表中的屬性;若游標(biāo)屬于顯式游標(biāo),則上表中的屬性里“SQL%”需要替換為自定義顯式游標(biāo)的名稱(chēng)。上表中的這4個(gè)屬性對(duì)于動(dòng)態(tài)游標(biāo)依然適用。[考點(diǎn)]游標(biāo)
24.
硬解析、軟解析、軟軟解析的區(qū)別是什么?正確答案:在Oracle中,每條SQL語(yǔ)句在正式執(zhí)行之前都需要經(jīng)過(guò)解析(Parse),根據(jù)解析的過(guò)程可以分為3種類(lèi)型:硬解析(HardParse)、軟解析(SoftParse)和軟軟解析(SoftSoftParse),軟軟解析也叫快速解析(FastParse)。DDL語(yǔ)句是從來(lái)不會(huì)共享使用的,也就是說(shuō),DDL語(yǔ)句每次執(zhí)行都需要進(jìn)行硬解析。但是,DML語(yǔ)句和SELECT語(yǔ)句會(huì)根據(jù)情況選擇是進(jìn)行硬解析,還是進(jìn)行軟解析或者進(jìn)行軟軟解析。SQL的解析過(guò)程大致可以參考下圖。
Oracle在解析和執(zhí)行目標(biāo)SQL時(shí),會(huì)先去當(dāng)前會(huì)話(huà)的PGA中查找是否存在匹配的緩存會(huì)話(huà)游標(biāo)。當(dāng)Oracle第一次解析和執(zhí)行目標(biāo)SQL時(shí)(顯然是硬解析),當(dāng)前會(huì)話(huà)的PGA中肯定不存在匹配的會(huì)話(huà)游標(biāo),這時(shí)Oracle會(huì)新生成一個(gè)會(huì)話(huà)游標(biāo)和一對(duì)共享游標(biāo)(包含一個(gè)父游標(biāo)和一個(gè)子游標(biāo)),這其中的共享游標(biāo)會(huì)存儲(chǔ)能被所有會(huì)話(huà)共享、重用的內(nèi)容(比如目標(biāo)s0L的解析樹(shù)、執(zhí)行計(jì)劃等),而會(huì)話(huà)游標(biāo)則會(huì)經(jīng)歷一次Open、Parse、Bind、Execute、Fetch和Close中的一個(gè)或多個(gè)階段。
對(duì)會(huì)話(huà)游標(biāo)和共享游標(biāo)之間的關(guān)聯(lián)關(guān)系如下總結(jié):
1)無(wú)論是硬解析、軟解析還是軟軟解析,Oracle在解析和執(zhí)行目標(biāo)SQL時(shí),始終會(huì)先去當(dāng)前會(huì)話(huà)的PGA中尋找是否存在匹配的緩存會(huì)話(huà)游標(biāo)。
2)如果在當(dāng)前會(huì)話(huà)的PGA中找不到匹配的緩存會(huì)話(huà)游標(biāo),那么Oracle就會(huì)去SGA的庫(kù)緩存中查找是否存在匹配的父游標(biāo)。如果在庫(kù)緩存中找不到匹配的父游標(biāo),那么Oracle就會(huì)新生成一個(gè)會(huì)話(huà)游標(biāo)和一對(duì)共享游標(biāo)(即父游標(biāo)和子游標(biāo));如果找到了匹配的父游標(biāo),但找不到匹配的子游標(biāo),那么Oracle就會(huì)新生成一個(gè)會(huì)話(huà)游標(biāo)和一個(gè)子游標(biāo)(這個(gè)子游標(biāo)會(huì)被掛在之前找到的匹配父游標(biāo)下)。無(wú)論哪一種情況,這兩個(gè)過(guò)程對(duì)應(yīng)的都是硬解析。
3)如果在當(dāng)前會(huì)話(huà)的PGA中找不到匹配的緩存會(huì)話(huà)游標(biāo),但在庫(kù)緩存中找到了匹配的父游標(biāo)和子游標(biāo),那么Oracle會(huì)新生成一個(gè)會(huì)話(huà)游標(biāo)并重用剛剛找到的匹配父游標(biāo)和子游標(biāo),這個(gè)過(guò)程對(duì)應(yīng)的就是軟解析。
4)如果在當(dāng)前會(huì)話(huà)的PGA中找到了匹配的緩存會(huì)話(huà)游標(biāo),那么此時(shí)Oracle就不再需要新生成一個(gè)會(huì)話(huà)游標(biāo),并且也不再需要像軟解析那樣去SGA的庫(kù)緩存中查找匹配的父游標(biāo),因?yàn)镺racle此時(shí)可以重用找到的匹配會(huì)話(huà)游標(biāo),并且可以通過(guò)這個(gè)會(huì)話(huà)游標(biāo)直接訪(fǎng)問(wèn)到該SQL對(duì)應(yīng)的父游標(biāo),這個(gè)過(guò)程就是軟軟解析。
硬解析、軟解析和軟軟解析的比對(duì)參考下表。
硬解析軟解析軟軟解析簡(jiǎn)介硬解析是指Oracle在執(zhí)行目標(biāo)SQL時(shí),在庫(kù)緩存中找不到可以重用的解析樹(shù)和執(zhí)行計(jì)劃,而不得不從頭開(kāi)始解析目標(biāo)SQL并生成相應(yīng)的父游標(biāo)和子游標(biāo)的過(guò)程。硬解析實(shí)際上有兩種類(lèi)型:一種是在庫(kù)緩存中找不到匹配的父游標(biāo),此時(shí)Oracle會(huì)從頭開(kāi)始解析目標(biāo)SQL,新生成一個(gè)父游標(biāo)和一個(gè)子游標(biāo),并把它們掛在對(duì)應(yīng)的HashBucket中:另外一種是找到了匹配的父游標(biāo)但未找到匹配的子游標(biāo),此時(shí)Oracle也會(huì)從頭開(kāi)始解析該目標(biāo)SQL,新生成一個(gè)子游標(biāo),并把這個(gè)子游標(biāo)掛在對(duì)應(yīng)的父游標(biāo)下軟解析是指Oracle在執(zhí)行目標(biāo)SQL時(shí),在庫(kù)緩存中找到了匹配的父游標(biāo)和子游標(biāo),并將存儲(chǔ)在子游標(biāo)中的解析樹(shù)和執(zhí)行計(jì)劃直接拿過(guò)來(lái)重用而無(wú)須從頭開(kāi)始解析的過(guò)程軟軟解析也叫快速解析(FastParse),是指若參數(shù)SESSION_CACHED_CURSORS的值大于0,并且該會(huì)話(huà)游標(biāo)所對(duì)應(yīng)的目標(biāo)SQL解析和執(zhí)行的次數(shù)超過(guò)3次,則此時(shí)該會(huì)話(huà)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高三數(shù)學(xué)(理)一輪總復(fù)習(xí):第九篇 統(tǒng)計(jì)與算法 含解析
- 離婚合同小說(shuō)全文在線(xiàn)閱讀下載
- 個(gè)人汽車(chē)租賃簡(jiǎn)單合同
- 路燈承包合同
- 軟件開(kāi)發(fā)簽約合同
- pso算法讀書(shū)筆記
- 屋頂翻修安全合同模板
- 醫(yī)療行業(yè)的市場(chǎng)拓展經(jīng)驗(yàn)總結(jié)
- 2025年人教五四新版選修歷史下冊(cè)月考試卷含答案
- 2025年新世紀(jì)版九年級(jí)生物下冊(cè)月考試卷含答案
- 南京地區(qū)幼兒園室內(nèi)空氣污染物與兒童健康的相關(guān)性研究
- 平安產(chǎn)險(xiǎn)陜西省地方財(cái)政生豬價(jià)格保險(xiǎn)條款
- 地震應(yīng)急救援培訓(xùn)課件
- 初中物理光學(xué)難題難度含解析答案
- 《霍爾效應(yīng)測(cè)量磁場(chǎng)》課件
- 《瘋狂動(dòng)物城》全本臺(tái)詞中英文對(duì)照
- 中專(zhuān)數(shù)學(xué)(基礎(chǔ)模塊)上冊(cè)課件
- 高考作文復(fù)習(xí)任務(wù)驅(qū)動(dòng)型作文的審題立意課件73張
- 品質(zhì)部經(jīng)理KRA KPI考核表
- 《馬克思主義與社會(huì)科學(xué)方法論》授課教案
- 一個(gè)28歲的漂亮小媳婦在某公司打工-被老板看上之后
評(píng)論
0/150
提交評(píng)論