




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Oracle基本索引概念當(dāng)從表中讀取數(shù)據(jù)時(shí),Oracle提供了兩個(gè)選擇:從表中讀取每一行(全表掃描)通過(guò)ROWID 次讀取一行當(dāng)我們要訪問(wèn)大型表的少數(shù)行時(shí),可能需要使用索引。因?yàn)槿绻麤](méi)有索引,那么只能進(jìn)行全表掃描。索引改進(jìn)性能的程度取決于兩個(gè)因素:1數(shù)據(jù)的選擇性2、表數(shù)據(jù)在數(shù)據(jù)塊上的分布如果選擇性很高(例如身份證號(hào)碼),那么根據(jù)索引值返回的ROWID很少,如果選擇性很低(例如國(guó)家)則返回的ROWID很多,那么索引的性能將會(huì)大大降低如果選擇性很高,但是相關(guān)的行在表中的存儲(chǔ)位置并不互相靠近,則會(huì)進(jìn)一步減少索引的益處,如果匹配索引值的數(shù)據(jù)分散在表的多個(gè)數(shù)據(jù)塊中,則必須從表中選擇多個(gè)單獨(dú)的塊以滿足查詢
2、,基于索引的讀取是單塊讀取,如果使用全表掃描,使用的是多塊讀取以快速掃描表,因此全表掃描不見(jiàn)得比索引掃描速度慢。不要迷信工具,每天學(xué)習(xí)一個(gè)視圖,了解視圖中常用列Oltp中使用B樹(shù)索引重點(diǎn)掌握?qǐng)?zhí)行計(jì)劃與索引的查找全表掃描性能不一定差,索引性能不一定好,代價(jià)是決定選擇的依據(jù)索引建立步驟:首先將表中的一列取出來(lái)放進(jìn)pga中的sort area區(qū)中排序,如果sort area不存在或不夠就放在臨時(shí)表空間中將排序得到列轉(zhuǎn)化成樹(shù)大多數(shù)排序都是在內(nèi)存中進(jìn)行的,但如果內(nèi)存不夠就使用磁盤進(jìn)行排序,我們只希望最 多進(jìn)行一次磁盤排序,多次磁盤排序影響性能我們可以將臨時(shí)表空間臨時(shí)性的擴(kuò)大,這樣排序空間加大,加快排序速
3、度 排序的目的是將相同的內(nèi)容放在一起,不用全表掃描索引的性能高是因?yàn)樗饕w積小,只有一個(gè)列,可以cache到內(nèi)存中索引訪問(wèn)總是訪問(wèn)的內(nèi)存,做到這點(diǎn)就要求索引選擇的列要窄Null在排序中不會(huì)產(chǎn)生對(duì)應(yīng)的數(shù)值,因?yàn)榱兄性试S存在一個(gè)null,就會(huì)有多個(gè)null,這些null不能對(duì)應(yīng)回相應(yīng)列中列值被刪除,索引也會(huì)被刪除,索引空間不會(huì)合并因?yàn)楸硎且詨K為單位的,可以被重復(fù)使用,表是無(wú)序的,只要盡可能的緊湊,但索引不 是,索引是有序的,不能插入,也不能整體上移,上移的代價(jià)很高。當(dāng)刪除的索引很多 時(shí),索引就變空了,這時(shí)需要重建索引索引是一顆樹(shù),有樹(shù)可以定位到塊,實(shí)現(xiàn)快速定位索引的缺點(diǎn):占用空間,占用內(nèi)存每次查找
4、都要從根查找,每次查找一個(gè)節(jié)點(diǎn)都是一次io過(guò)程,最后還會(huì)有一次磁盤io的過(guò)程讀取表對(duì)應(yīng)的信息對(duì)dml影響大,表更新時(shí)索引也需要更新,他們是同步的 dml操作后,一定要同步索引,有索引的dml操作時(shí)間是無(wú)索引的3倍時(shí)間,因此索引的數(shù)量控制在6個(gè)內(nèi)數(shù)據(jù)選擇性:列的唯一性非常高Rowid :根據(jù)rowid定位基于數(shù)據(jù)文件的數(shù)據(jù)塊的數(shù)據(jù)行,根據(jù)rowid找記錄的速度最快調(diào)優(yōu)不期望通過(guò)索引有多大的改善,通常是調(diào)表索引是有序的,進(jìn)行范圍索引時(shí)會(huì)得到一組rowid,比如5個(gè)。我們希望這 5個(gè)rowid落在一個(gè)數(shù)據(jù)塊上,不希望落在5個(gè)塊上在訂單號(hào)和日期上建索引較好,日期函數(shù)除外,它不能建索引索引總是單塊讀,一
5、個(gè)挨著一個(gè)讀,全表掃描是多塊讀,一次讀多個(gè)塊,索引性能很高 全表掃描有一個(gè)問(wèn)題是當(dāng)大的表讀進(jìn)內(nèi)存中時(shí),會(huì)沖刷小表全表掃描和索引查找之間的平衡點(diǎn)1分區(qū)2、并行DML3、并行查詢4、使用 db_file_multiblock_read_count 進(jìn)行更大的 10 操作5、硬件更為快速6、磁盤上的緩存可以緩存更多的數(shù)據(jù)7、內(nèi)存的廉價(jià)使得我們的內(nèi)存進(jìn)一步增大8、Oracle采用了增強(qiáng)的索引特性(例如跳躍式掃描索引)SQL show parameter db_file_multiblock_read_co unt;NAMETYPEVALUEdb file multiblock read countin
6、teger8cbo優(yōu)化器:sql語(yǔ)句作出多個(gè)執(zhí)行計(jì)劃,執(zhí)行方案,使用性能最高并且性能影響最小,代價(jià) 最小的。這個(gè)代價(jià)是估算得到的,所以執(zhí)行結(jié)果不一定準(zhǔn) 確,它是根據(jù)表和索引的統(tǒng)計(jì)數(shù)據(jù),統(tǒng)計(jì)數(shù)據(jù)在字典中。包括行數(shù),塊數(shù),每一列的選擇 性,不同的行的不同數(shù)值范圍Cbo嚴(yán)重依賴統(tǒng)計(jì)數(shù)據(jù),統(tǒng)計(jì)一定要正確,但不會(huì)影響結(jié)果,只是時(shí)間快慢的問(wèn)題Rbo優(yōu)化器:根據(jù)規(guī)則作出多個(gè)執(zhí)行計(jì)劃,由一個(gè)規(guī)則表,對(duì)sql進(jìn)行比較。From a,b與fromb,a因?yàn)閷?duì)應(yīng)不同的規(guī)則,因此執(zhí)行計(jì)劃不同,因此sql語(yǔ)句寫得漂亮指的就是 rbo在9i前可以選擇rbo或cbo,在10g只有cbo,因?yàn)樵?0g時(shí)出現(xiàn)了調(diào)度和作業(yè),調(diào)度
7、完成 計(jì)劃任務(wù),每天執(zhí)行統(tǒng)計(jì)作業(yè),收集統(tǒng)計(jì)數(shù)據(jù)。統(tǒng)計(jì)數(shù)據(jù)一定要準(zhǔn)確的。統(tǒng)計(jì)操作是非常耗資源的,所以不一定掃表,可能是使用字典10g中還允許使用指定rbo。但初始化參數(shù)時(shí)已經(jīng)沒(méi)有rbo 了數(shù)據(jù)庫(kù)遷移也要遷移統(tǒng)計(jì)數(shù)據(jù) 分區(qū):多個(gè)分區(qū)在多個(gè)磁盤上,oracle自發(fā)的并發(fā)讀Oracle傾向于全表掃描,因?yàn)槿頀呙鑳?yōu)于索引掃描,全表是并行讀,索引是單塊讀 db_file_multiblock_read_count導(dǎo)致使用全表,默認(rèn)一次讀8個(gè)塊。一個(gè)io讀8個(gè)塊,不要輕易調(diào)這個(gè)參數(shù),會(huì)導(dǎo)致全表掃描所謂硬件就是指的存儲(chǔ)設(shè)備建索引需要更多內(nèi)存走全表掃描需要消耗更過(guò)io如果硬件快,物理10 cost低,走全表掃
8、描硬盤的緩存導(dǎo)致物理10性能提高,但對(duì)異步10在計(jì)算成本時(shí)產(chǎn)生誤差 目前的智能技術(shù)不能算是成熟db_file_multiblock_read_cou nt的自動(dòng)調(diào)整關(guān)于這個(gè)參數(shù),經(jīng)過(guò)幾多變化,在Oracle10gR2中終于修成了正果,實(shí)現(xiàn)了自動(dòng)調(diào)整。很久以前演過(guò)過(guò)這個(gè)參數(shù),初始化參數(shù)db_file_multiblock_read_count 影響Oracle在執(zhí)行全表掃描時(shí)一次讀取的block的數(shù)量.db_file_multiblock_read_count的設(shè)置要受 OS最大10能力影響,也就是說(shuō),如果你系統(tǒng)的 硬件10能力有限,即使設(shè)置再大的db_file_multiblock_read_
9、count也是沒(méi)有用的。理論上,最大 db_file_multiblock_read_count和系統(tǒng)10能力應(yīng)該有如下關(guān)系:Max(db_file_multiblock_read_cou nt) = Max0sl0size/db_block_size當(dāng)然這個(gè) Max(db_file_multiblock_read_count)還要受 Oracle 的限制,目前 Oracle 所支持的最大 db_file_multiblock_read_count 值為 128.我們可以通過(guò)db_file_multiblock_read_count來(lái)測(cè)試Oracle在不同系統(tǒng)下,單次10最大所能讀取得數(shù)據(jù)量這
10、個(gè)參數(shù)的設(shè)置可能影響到CBO優(yōu)化器的執(zhí)行計(jì)劃選擇,所以O(shè)racle通常缺省設(shè)置為16,不推薦設(shè)置高于32的值。在Oracle10gR2以前的版本中,DBA必須根據(jù)db_block_size參數(shù),以及應(yīng)用系統(tǒng)的特性, 來(lái)調(diào)整 db_file_multiblock_read_count參數(shù)。該參數(shù)值將影響CBO在該產(chǎn)生何種 SQL執(zhí)行計(jì)劃上的判斷。我們知道如下的公式,其中max I/O chunk size跟操作系統(tǒng)有關(guān),但是Oracle文檔中也指出大多數(shù)操作系統(tǒng)上該值為1M。 db_file_multiblock_read_count = max I/O chunk size /db_block
11、_size目前 Oracle 所支持的最大 db_file_multiblock_read_count 值為 128.1024K/8K=128在Oracle10gR2之后的版本(10gR2和11g)中,Oracle數(shù)據(jù)庫(kù)已經(jīng)可以根據(jù)系統(tǒng)的10能力以及Buffer Cache的大小來(lái)動(dòng)態(tài)調(diào)整該參數(shù)值,Oracle建議不要顯式設(shè)置該參數(shù)值。在我的一個(gè)11.1.0.7的環(huán)境中,這個(gè)值被自動(dòng)調(diào)整為73:SQL select * from v$version;BANNEROracle Database 11g En terprise Edition Release 11.1.0.7.0 - Produc
12、tion PL/SQL Release 11.1.0.7.0 - Productio nCORE 11.1.0.7.0 ProductionTNS for Linux: Version 11.1.0.7.0 - ProductionNLSRTL Versio n 11.1.0.7.0 - ProductionSQL show parameter multiNAMETYPEVALUEdb_file_multiblock_read_co untin teger73parallel_adaptive_multi_userboolea nTRUESELECT、UPDATE、DELETE+WHERE 條
13、件可以從索弓I中得至収子處(前提是:當(dāng)訪問(wèn)的行數(shù)較少時(shí))一般來(lái)說(shuō),增加索引會(huì)帶來(lái)insert語(yǔ)句性能的下降如果根據(jù)未索引列 update索引列,那么也會(huì)帶來(lái)性能的降低大量的delete也會(huì)因?yàn)樗饕拇嬖诙鴮?dǎo)致性能降低因此我們要分析具體的情況,判斷索引和DML語(yǔ)句之間的關(guān)系有where條件時(shí)走索引,無(wú) where條件時(shí)走全表掃描Insert走索引,因?yàn)槭褂昧酥麈I根據(jù)索引列update未索引列,性能高,update更新為索引列根據(jù)未索引列update索引列,既改變了索引列又改變了索引,性能低葉子塊拆分:當(dāng)update 一個(gè)索引列時(shí),導(dǎo)致索引列重新排序,改變的記錄可能被擠到了最后一條記錄的 下面,此
14、時(shí)如果pct free已經(jīng)滿了,這個(gè)塊將導(dǎo)致分裂,將原來(lái)放在一個(gè)塊上的記錄數(shù)據(jù), 分成了 2個(gè)塊。結(jié)果導(dǎo)致索引性能降低。這不屬于行遷移不停的update導(dǎo)致pct free引發(fā)后果:1分配數(shù)據(jù)塊,有等待事件2數(shù)據(jù)拷貝Insert和delete影響都不如 update影響大硬盤數(shù)據(jù)是以堆的方式保存的,通過(guò)鏈接穿起來(lái)。拆分就是又增加了一個(gè)塊,建立鏈接,是內(nèi)容被拆分了我們?nèi)绾稳トヅ袛嘁粋€(gè)表上的索引呢?SQL create table a.a as select * from dba_objects;表已創(chuàng)建。SQL create in dex a.idx_a on a.a(object_id);索引
15、已創(chuàng)建。SQL select table_ name,i ndex_ name from dba_ in dexes where table_ name=A:INDEX NAMETABLE NAMESQL col table_ name format a5;SQL col in dex_ name format a5;SQL col colu mn_n ame format a10;SQL select table _n ame,i ndex_ name,colu mn_n ame,colu mn _positi on from dba_ in d_colum ns where table_
16、name=A:TABLE INDEX COLUMN_NAMCOLUMN_POSITIONAIDX AOBJECT ID1索引一定在表上的看性能不用DBA工具,尤其是哪些廉價(jià)的工具。看性能一定要看到根上看對(duì)象可以使用視圖發(fā)現(xiàn)數(shù)據(jù)庫(kù)存在問(wèn)題,不要上來(lái)就憑經(jīng)驗(yàn)解決,要先了解數(shù)據(jù)庫(kù)的工作過(guò)程發(fā)現(xiàn)一個(gè)DML很慢,1。是否有等待事件2。看索引,訪問(wèn)了哪些表,建立了哪些索引UPDATE索引列要注意頁(yè)拆分和數(shù)據(jù)遷移Del對(duì)索引有長(zhǎng)期影響,需要重建索引Insert會(huì)頁(yè)拆分批量導(dǎo)數(shù)據(jù)容易導(dǎo)致頁(yè)拆分通常情況下數(shù)據(jù)庫(kù)高度在2-3,如果空數(shù)據(jù)超過(guò) 25%,重建索引會(huì)降低一個(gè)高度,性能會(huì)提高組合索引當(dāng)某個(gè)索引包含有多個(gè)列
17、時(shí),我們稱這個(gè)索引為組合索引。在使用組合索引的時(shí)候,要謹(jǐn)慎選擇索引列中的列順序。一般來(lái)說(shuō),索引的第一列應(yīng)該是最有可能在where子句中使用的列,并且也是在索引中最具有選擇性的列。對(duì)于9i以前,查詢只能在 where子句中使用索引的第一列時(shí)使用索引。SQL select table _n ame,i ndex_ name,colu mn_n ame,colu mn _positi on from dba_ in d_colum ns where table_ name=A:TABLE INDEX COLUMN_NAM COLUMN_POSITIONA IDX_A OBJECT_IDA IND O
18、BJECT IDA A_IND OBJECT_NAM1 E除非在where子句中給object_id指定一個(gè)值,否則一般不會(huì)使用組合索引。組合索引就是有多個(gè)列組合成索弓I,組合索引有前導(dǎo)列的概念,所謂前導(dǎo)列就是指的最先排列的列,比如有 3個(gè)列a, b, c, a先排列,然后b在a排列的基礎(chǔ)上在排,c同樣。 A的選擇性低時(shí),b排序才有意義,c同樣。索引一旦是雜亂的就失去了意義。使用組合索引一定要包含 a,然后b或c或be。但a的選擇性低時(shí),a的作用就不太大了。Where中有ab和c時(shí),特別適合使用組合索引,但使用組合索引不一定就能提高性能。如果A的選擇性高,b和c的意義就不太大了列越寬,索引越大
19、,占內(nèi)存越多。組合索引適合于 A的選擇性低的情況,a如果能排序,b和c就是雜亂的,b和c不能單 獨(dú)做索引組合索引一定是a, b, c同時(shí)索引,否則不如建 3個(gè)索引從Oracle 9i開(kāi)始,弓I入了跳躍式索引掃描功能,即使在 where子句中沒(méi)有指定 empno的數(shù) 值,也會(huì)可能會(huì)使用索引。在10g以后出現(xiàn)了跳躍式掃描,當(dāng)where中沒(méi)有出現(xiàn)a,只出現(xiàn)b時(shí),當(dāng)b的選擇性高于a時(shí)也會(huì)走索引。此時(shí)會(huì)同時(shí)發(fā) 生多個(gè)掃描,這些掃描是并行的,每個(gè)掃描對(duì)應(yīng)著a的一個(gè)值。因?yàn)閍的選擇性低Skip scan是oracle自己完成的,sql中沒(méi)有a的條件在9i前這種情況只能走全表掃描組合索引列名包含在索引中,se
20、lect會(huì)走全索引掃描,因?yàn)樗饕?,速度快組合索引可以滿足對(duì)表的查詢,如果有一個(gè)空,另一個(gè)也非空,也會(huì)出現(xiàn)在索引中,但 如果兩個(gè)都是空就不會(huì)出現(xiàn)在索引中跳躍式索引的前提是前導(dǎo)列選擇行低,索引跳躍式掃描使用不太多fr?m empjwhsre 占電并 二F arudd 二 123U1TIO1Tselect eirip_najne front emp_wher 二 5 M anl emp_id 二 123:在Oracle數(shù)據(jù)庫(kù)的內(nèi)部,生成了兩個(gè)查詢,然后對(duì)兩個(gè)查詢的ROWID進(jìn)行了聯(lián)合。當(dāng)使用跳躍式索引掃描時(shí),自動(dòng)給 SEX加上了數(shù)值,啟用了兩個(gè)查詢。如果SEX有50個(gè)數(shù)值,那么需要啟用 50個(gè)查詢
21、才能完成查詢,因此性能大大降低。因此是否適合使用跳躍 式索引掃描,取決于第一個(gè)索引列的選擇性。一般建議第一個(gè)列的可選性非常低。跳躍式索引掃描相對(duì)索引直接掃描速度要慢一些,但是相對(duì)表掃描速度還是要快很多。使用跳躍式索引的條件1優(yōu)化器認(rèn)為是合適的2索引中的前導(dǎo)列的唯一值的數(shù)量能滿足一定的條件3優(yōu)化器要知道前導(dǎo)列的值分布(通過(guò)分析/統(tǒng)計(jì)表得到)4合適的SQL語(yǔ)句跳躍式掃描相對(duì)索引掃描慢一些,因?yàn)槭翘S式掃描是全索引掃描。不過(guò)因?yàn)榘l(fā)生在內(nèi)存中, 所以速度不是很慢統(tǒng)計(jì)數(shù)據(jù)中包括列的數(shù)據(jù)分布在那個(gè)塊如果oracle沒(méi)有選擇使用跳躍式索引掃描,那么可能選擇使用索引快速全局掃描或全表掃 描。我們花點(diǎn)時(shí)間來(lái)研究
22、一下 Oracle中掃描數(shù)據(jù)的方法:1、全表掃描(Full Table Scan FTS)Oracle讀取表中所有的行、多塊讀操作可以大大的減少10的次數(shù)、利用多塊讀可以大大的提高全表掃描的速度、只有在全表掃描的情況下才能使用多塊讀。在較大的表上不建議使用全表掃描、如果讀取表的數(shù)據(jù)總量超過(guò)5% 10%,那么通常進(jìn)行全表掃描。并行查詢可能會(huì)使得我們的路徑選擇采用全表掃描。新技術(shù)促使oracle使用全表掃描 db_file_multiblock_read_count是典型的全表掃描設(shè)置 索引在表連接問(wèn)題上有致命問(wèn)題SQL explain plan for select * from dual;已解
23、釋。SQL select * from table(dbms_xpla n. display);PLAN_TABLE_OUTPUTPlan hash value: 272002086| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time |0 | SELECT STATEMENT |1 |2 |2(0)| 00:00:01 |1 | TABLE ACCESS FULL | DUAL |1 |2 |2(0)| 00:00:01 |已選擇 8 行解釋執(zhí)行語(yǔ)句的執(zhí)行計(jì)劃Operation 是執(zhí)行計(jì)劃Table access full 全表掃
24、描,上面一行是 sql 語(yǔ)句SQL select rowid from a.a where rownum=1;ROWIDAAAMjjAAEAAADy8AAASQL explain plan for select * from a.a where rowid=AAAMjjAAEAAADy8AAA;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 2574054659| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| TimePLA
25、N_TABLE_OUTPUT| 0 | SELECT STATEMENT | 1 | 93 | 1 (0)| 00:00:01 | 1 | TABLE ACCESS BY USER ROWID | A | 1 | 93 |1 (0)| 00:00:01 |已選擇 8 行。Rowid 表示的是一行而不是一列3、索引掃描或者索引查找( index scan index lookup )通過(guò)索引找到數(shù)據(jù)行的 ROWID 、然后通過(guò) ROWID 直接到表中查找數(shù)據(jù),這種方式稱為索 引查找或者索引掃描。 因?yàn)橐粋€(gè) ROWID 對(duì)應(yīng)一個(gè)數(shù)據(jù)行, 因此這種方式采用的也是單塊讀。在索引中,除了存儲(chǔ)每個(gè)索引值、
26、還存儲(chǔ)相應(yīng)的 ROWID ,索引掃描分為兩步:1、掃描索引得到相應(yīng)的 ROWID2、通過(guò)找到的 ROWID 從表中讀取相應(yīng)的數(shù)據(jù)每次采用的都是單塊 IO 讀因?yàn)樗饕?、而且?jīng)常使用,因此通常被 cache 到內(nèi)存中,因此第一步通常是邏輯讀(數(shù)據(jù) 可以從內(nèi)存中得到)因?yàn)楸頂?shù)據(jù)比較大、因此第二步讀通常是物理讀,因此性能較低SQL explain plan for select * from a.a where object_id=1;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 1
27、100842037| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| TimePLAN_TABLE_OUTPUT| 0 | SELECT STATEMENT|1 |93 |2 (0)| 00:00:01 | 1| TABLE ACCESS BY INDEX ROWID| A|1 |93 |2 (0)| 00:00:01 |* 2| INDEX RANGE SCAN| IDX_A |1 |1 (0)| 00:00:01 |PLANTABLE_OUTPUTPredicate Information (identified by operatio
28、n id):2 - access(OBJECT_ID=1) 已選擇 14 行。因?yàn)樵L問(wèn)路徑走的是非唯一索引,因此是INDEX RANGE SCAN這個(gè)查詢中,因?yàn)樵L問(wèn)的列都在索引中,因此省略了訪問(wèn)的第二步。SQL explain plan for select object_id from a.a where object_id=1;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 810214320| Id | Operation| Name | Rows | Bytes | C
29、ost (%CPU)| Time| 0 | SELECT STATEMENT |1 | 5 |1 (0)| 00:00:01 |1 (0)| 00:00:01 |* 1 | INDEX RANGE SCAN| IDX_A | 1 | 5 |Predicate Information (identified by operation id):PLAN_TABLE_OUTPUT1 - access(OBJECT_ID=1) 已選擇 13 行。Where ,=,between 都會(huì)走范圍索引。 不走索引SQL explain plan for select * from a.a where obje
30、ct_id select * from table(dbms_xplan.display);(0)| 00:00:01 |PLAN_TABLE_OUTPUTPlan hash value: 1100842037| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| TimePLAN_TABLE_OUTPUT0 | SELECT STATEMENT|93 |31 |1 | TABLE ACCESS BY INDEX ROWID| A93 |(0)| 00:00:01 |*2 | INDEX RANGE SCAN| IDX_A |(0)| 00:0
31、0:01 |PLAN_TABLE_OUTPUTPredicate Information (identified by operation id):2 - access(OBJECT_ID create table a.a(a int primary key);表已創(chuàng)建。SQL select index_name from dba_indexes where table_name=A;INDEXSYS_C005162SQL insert into a.a select object_id from dba_objects;已創(chuàng)建 49793 行。SQL commit;提交完成。SQL expl
32、ain plan for select * from a.a where a=2;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 2342676264| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| TimePLAN_TABLE_OUTPUT| 0 | SELECT STATEMENT | | 1 | 13 | 1 (0)| 00:00:01|* 1 | INDEX UNIQUE SCAN| SYS_C005162 | 1
33、| 13 |1 (0)| 00:00:01Predicate Information (identified by operation id):PLAN_TABLE_OUTPUT1 - access(A=2) 已選擇 13 行。索引范圍掃描1、在唯一鍵上使用 range 操作符( 、 =、 explain plan for select * from a.a where a select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 2932832188| Id | Operation | Name | R
34、ows | Bytes | Cost (%CPU)| Time |0 | SELECT STATEMENT | |1 |13 |1 (0)| 00:00:01 |*1 | INDEX RANGE SCAN|SYS_C005162 | 1 | 13 |1 (0)| 00:00:01 |Predicate Information (identified by operation id):PLAN_TABLE_OUTPUT1 - access(A create table a.a (a1 int,a2 int,a3 int,a4 int);表已創(chuàng)建。SQL create index idx_a on
35、 a.a(a1,a2,a3);索引已創(chuàng)建。SQL expla in pla n for select * from a.a where a 1 =2;已解釋。SQL select * from table(dbms_xpla n. display);PLAN_TABLE_OUTPUTPlan hash value: 1100842037| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| TimeIPLAN_TABLE_OUTPUT|0 I SELECT STATEMENTII1 I52 I2(0)I 00:00:01 I|1 | TABLE
36、 ACCESS BY INDEX R0WID| A|1 I52 I2(0)I 00:00:01 I|*2 | INDEX RANGE SCANI idx_a |1 II1(0)I 00:00:01 IPLAN_TABLE_OUTPUTPredicate Information (identified by operation id):2 - access(A1=2)Note-dynamic sampling used for this statement已選擇18行。部分列:abc三個(gè)索引中,只使用了ab或ac只要是非唯一索引,一定是有范圍的索引全掃描查詢出的數(shù)據(jù)必須全部從索引中得到SQL c
37、reate table a (a int primary key);表已創(chuàng)建。SQL expla in pla n for select a from a where a1;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 2248738933| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 0 | SELECT STATEMENT | 47334 | 600K| 24 (9)| 00:00:01 |* 1 |
38、 TABLE ACCESS FULL| A | 47334 | 600K| 24 (9)| 00:00:01 |Predicate Information (identified by operation id):PLAN_TABLE_OUTPUT1 - filter(A1)Note- dynamic sampling used for this statement 已選擇 17 行。索引快速掃描 掃描索引塊中的所有數(shù)據(jù)塊,這點(diǎn)與full index scan 相似,但是索引快速掃描不進(jìn)行數(shù)據(jù)的排序,在這種方式下, 可以使用多塊讀功能、 也可以使用并行讀功能, 最大化數(shù)據(jù)的吞吐量。 SQL s
39、elect table_name,index_name,column_name from dba_ind_columns where table_n ame=A;TABLE INDEXCOLUMN_NAMA IDX_AOBJECT_IDSQL explain plan for select object_id from a where object_id !=0;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 1047246182| Id | Operation| Name |
40、Rows | Bytes | Cost (%CPU)| Time | 0 | SELECT STATEMENT| 47847 | 607K| 34 (6)| 00:00:01 |I* 1 | INDEX FAST FULL SCAN | IDX_A | 47847 |607K|34(6)| 00:00:01 |Predicate In formatio n (ide ntified by operati on id):PLAN_TABLE_OUTPUT1 - filter(OBJECT_ID0)Note-dyn amic sampli ng used for this stateme nt已選
41、擇17行讀索引都是順序的索引全掃描是按照鏈接順序掃描索引 快速掃描是同時(shí)讀多個(gè)塊索引全掃描查詢出的數(shù)據(jù)必須全部從索引中得到使用索引全掃描的條件是索引列設(shè)定了非空,并且查找結(jié)果排序如果索引列未設(shè)置非空,則執(zhí)行全表掃描如果查找結(jié)果不要求排序,則走索引快速掃描SQL desc a;名稱是否為空?類型OWNEROBJECT_NAMESUBOBJECT_NAMEOBJECT_IDDATA_OBJECT_IDVARCHAR2(30)VARCHAR2(128)VARCHAR2(30)NOT NULL NUMBERNUMBERSQL expla in pla n for select object_id fr
42、om a order by object_id;已解釋。SQL select * from table(dbms_xpla n. display);PLAN_TABLE_OUTPUTPlan hash value: 257628703| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time | 0 | SELECT STATEMENT | | 1371K| 16M| 4424 (1)| 00:00:54 | | 1 | INDEX FULL SCAN | IDX_A | 1371K| 16M| 4424 (1)| 00:00:54 |N
43、otePLAN_TABLE_OUTPUT- dynamic sampling used for this statement 已選擇 12 行。SQL explain plan for select object_id from a ; 已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 1047246182| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1
44、371K| 16M| 1203 (1)| 00:00:15 | | 1 | INDEX FAST FULL SCAN | IDX_A | 1371K| 16M| 1203 (1)| 00:00:15 |NotePLAN_TABLE_OUTPUT- dynamic sampling used for this statement 已選擇 12 行。大家說(shuō) select count(*) 走什么類型的索引 SQL explain plan for select count(*) f rom a;已解釋。SQL select * from table(dbms_xplan.display);PLAN
45、_TABLE_OUTPUTPlan hash value: 484915617| Id | Operation| Name | Rows | Cost (%CPU)| Time| 0 | SELECT STATEMENT|1 | 1203 (1)| 00:00:15 | 1 | SORT AGGREGATE | 2 | INDEX FAST FULL SCAN | IDX_A | 1371K| 1203 (1)| 00:00:15 |NotePLAN_TABLE_OUTPUT- dynamic sampling used for this statement已選擇 13 行如果 select
46、count( 非索引列 ) 呢?SQL explain plan for select count(owner) from a;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 3918351354| Id | Operation| Name | Rows | Bytes | Cost (%CPU)| Time|0 | SELECT STATEMENT| |1 |17 |5967(2)| 00:01:12 |1 |SORT AGGREGATE| |1 |17 | |2 |TABLE
47、 ACCESS FULL | A| 1371K|22M|5967 (2)| 00:01:12 |NotePLAN_TABLE_OUTPUT- dynamic sampling used for this statement 已選擇 13 行。Where 條件中使用了 !=或者 他的索引如何走? 分兩種情況SQL explain plan for select object_id from a where object_id 10;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 1
48、047246182| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1370K| 16M| 1204 (1)| 00:00:15 | |* 1 | INDEX FAST FULL SCAN | IDX_A | 1370K| 16M| 1204 (1)| 00:00:15 |Predicate Information (identified by operation id):PLAN_TABLE_OUTPUT1 - filter(OBJECT_ID10)Note- dyn
49、amic sampling used for this statement 已選擇 17 行。如果 select 條件中只包含了索引列,則走索引快速掃描SQL explain plan for select * from a where object_id 10;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 2248738933| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT ST
50、ATEMENT | | 1370K| 231M| 6035 (3)| 00:01:13 | |* 1 | TABLE ACCESS FULL | A | 1370K| 231M| 6035 (3)| 00:01:13 |Predicate Information (identified by operation id):1 - filter(OBJECT_ID10)PLAN_TABLE_OUTPUTNote- dynamic sampling used for this statement已選擇 17 行。如果 select 中包括了全部列,則走全表掃描那么如果是 或 explain plan
51、 for select object_id from a where object_id 10;已解釋。SQL select * from table(dbms_xplan.display);PLAN_TABLE_OUTPUTPlan hash value: 1047246182| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | | 0 | SELECT STATEMENT | | 1368K| 16M| 1204 (1)| 00:00:15 | |* 1 | INDEX FAST FULL SCAN| IDX_A | 13
52、68K| 16M| 1204 (1)| 00:00:15 |Predicate Information (identified by operation id):PLAN_TABLE_OUTPUT1 - filter(OBJECT_ID10) note- dynamic sampling used for this statement 已選擇 17 行。如果 select 列里有索引列,則走索引快速掃描SQL explain plan for select * from a where object_id 10;已解釋。SQL select * from table(dbms_xplan.display);Plan hash value: 1100842037| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| TimePLAN_TABLE_OUTPUT| 0 | SELECT STATEMENT| | 1368K| 230M| 5127 (1)| 00:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 同城轉(zhuǎn)租 店鋪合同范例
- 雙工作合同范本
- 雙方合資協(xié)議合同范本
- 加工承攬合同范本新
- 勞務(wù)短期合同范本
- 廚柜代銷合同范本
- 租賃合同變更服務(wù)合同范本
- 印刷產(chǎn)品定做合同范本
- 大件搬運(yùn)服務(wù)合同范本
- 合作傭金合同范本
- 2024年湖南理工職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)必考題
- 中國(guó)風(fēng)川劇戲曲京劇文化傳統(tǒng)文化國(guó)粹世界戲劇日活動(dòng)策劃完整課件兩篇
- (正式版)JTT 1495-2024 公路水運(yùn)危險(xiǎn)性較大工程安全專項(xiàng)施工方案審查規(guī)程
- 醫(yī)院dip付費(fèi)績(jī)效考核制度
- 20G520-1-2鋼吊車梁(6m-9m)2020年合訂本
- 電梯維護(hù)保養(yǎng)規(guī)則(TSG T5002-2017)
- 義務(wù)教育數(shù)學(xué)課程標(biāo)準(zhǔn)(2022年版)解讀與案例分析
- 植物營(yíng)養(yǎng)學(xué)課件
- 體育概論課外體育活動(dòng)
- 自考英語(yǔ)二詞性轉(zhuǎn)換大全
- 屋頂拆除方案
評(píng)論
0/150
提交評(píng)論