亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Oracle索引分析與比較

系統(tǒng) 1761 0

索引在各種關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)中都是舉足輕重的組成部分,其對(duì)于提高檢索數(shù)據(jù)的速度起至關(guān)重要的作用。在Oracle中,索引基本分為以下幾種:B*Tree索引,反向索引,降序索引,位圖索引,函數(shù)索引,interMedia全文索引等。本文主要就前6種索引進(jìn)行分析,由于interMedia全文索引涉及的內(nèi)容可以單獨(dú)寫一篇文章,所以不在此對(duì)其做分析。

首先給出各種索引的簡(jiǎn)要解釋:

b*tree index:幾乎所有的關(guān)系型數(shù)據(jù)庫(kù)中都有b*tree類型索引,也是被最多使用的。其樹(shù)結(jié)構(gòu)與二叉樹(shù)比較類似,根據(jù)rid快速定位所訪問(wèn)的行。
反向索引:反轉(zhuǎn)了b*tree索引碼中的字節(jié),是索引條目分配更均勻,多用于并行服務(wù)器環(huán)境下,用于減少索引葉的競(jìng)爭(zhēng)。
降序索引:8i中新出現(xiàn)的索引類型,針對(duì)逆向排序的查詢。
位圖索引:使用位圖來(lái)管理與數(shù)據(jù)行的對(duì)應(yīng)關(guān)系,多用于OLAP系統(tǒng)。
函數(shù)索引:這種索引中保存了數(shù)據(jù)列基于function返回的值,在select * from table where function(column)=value這種類型的語(yǔ)句中起作用。

2 各種索引的結(jié)構(gòu)分析

2.1 B*Tree索引B*Tree索引是最常見(jiàn)的索引結(jié)構(gòu),默認(rèn)建立的索引就是這種類型的索引。B*Tree索引在檢索高基數(shù)數(shù)據(jù)列(高基數(shù)數(shù)據(jù)列是指該列有很多不同的值)時(shí)提供了最好的性能。當(dāng)取出的行數(shù)占總行數(shù)比例較小時(shí)B-Tree索引比全表檢索提供了更有效的方法。但當(dāng)檢查的范圍超過(guò)表的10%時(shí)就不能提高取回?cái)?shù)據(jù)的性能。B-Tree索引是基于二叉樹(shù)的,由分支塊(branch block)和葉塊(leaf block)組成。在樹(shù)結(jié)構(gòu)中,位于最底層底塊被稱為葉塊,包含每個(gè)被索引列的值和行所對(duì)應(yīng)的rowid。在葉節(jié)點(diǎn)的上面是分支塊,用來(lái)導(dǎo)航結(jié)構(gòu),包含了索引列(關(guān)鍵字)范圍和另一索引塊的地址。

假設(shè)我們要找索引中值為80的行,從索引樹(shù)的最上層入口開(kāi)始,定位到大于等于50,然后往左找,找到第2個(gè)分支塊,定位為75-100,最后再定位到葉塊上,找到80所對(duì)應(yīng)的rowid,然后根據(jù)rowid去讀取數(shù)據(jù)塊獲取數(shù)據(jù)。如果查詢條件是范圍選擇的,比如where column >20 and column <80,那么會(huì)先定位到第一個(gè)包含20的葉塊,然后橫向查找其他的葉塊,直到找到包含80的塊為止,不用每次都從入口進(jìn)去再重新定位。

2.2 反向索引

反向索引是B*Tree索引的一個(gè)分支,它的設(shè)計(jì)是為了運(yùn)用在某些特定的環(huán)境下的。Oracle推出它的主要目的就是為了降低在并行服務(wù)器(Oracle Parallel Server)環(huán)境下索引葉塊的爭(zhēng)用。當(dāng)B*Tree索引中有一列是由遞增的序列號(hào)產(chǎn)生的話,那么這些索引信息基本上分布在同一個(gè)葉塊,當(dāng)用戶修改或訪問(wèn)相似的列時(shí),索引塊很容易產(chǎn)生爭(zhēng)用。反向索引中的索引碼將會(huì)被分布到各個(gè)索引塊中,減少了爭(zhēng)用。反向索引反轉(zhuǎn)了索引碼中每列的字節(jié),通過(guò)dump()函數(shù)我們可以清楚得看見(jiàn)它做了什么。舉個(gè)例子:1,2,3三個(gè)連續(xù)的數(shù),用dump()函數(shù)看它們?cè)贠racle內(nèi)部的表示方法。

      
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select ' number ' , dump ( 1 , 16 ) from dual 2 union all select ' number ' , dump ( 2 , 16 ) from dual 3 union all select ' number ' , dump ( 3 , 16 ) from dual; ' NUMBE DUMP(1,16) ------ ----------------- number Typ=2 Len=2: c1,2 (1) number Typ=2 Len=2: c1,3 (2) number Typ=2 Len=2: c1,4 (3) 再對(duì)比一下反向以后的情況: SQL> select ' number ' ,dump(reverse(1),16) from dual 2 union all select ' number ' ,dump(reverse(2),16) from dual 3 union all select ' number ' ,dump(reverse(3),16) from dual; ' NUMBE DUMP ( REVERSE ( 1 ), 1 -- ---- ----------------- number Typ = 2 Len = 2 : 2 ,c1 ( 1 number Typ = 2 Len = 2 : 3 ,c1 ( 2 number Typ = 2 Len = 2 : 4 ,c1 ( 3

我們發(fā)現(xiàn)索引碼的結(jié)構(gòu)整個(gè)顛倒過(guò)來(lái)了,這樣1,2,3個(gè)索引碼基本上不會(huì)出現(xiàn)在同一個(gè)葉塊里,所以減少了爭(zhēng)用。不過(guò)反向索引又一個(gè)缺點(diǎn)就是不能在所有使用常規(guī)索引的地方使用。在范圍搜索中其不能被使用,例如,where column>value,因?yàn)樵谒饕娜~塊中索引碼沒(méi)有分類,所以不能通過(guò)搜索相鄰葉塊完成區(qū)域掃描。

2.3 降序索引

降序索引是8i里面新出現(xiàn)的一種索引,是B*Tree的另一個(gè)衍生物,它的變化就是列在索引中的儲(chǔ)存方式從升序變成了降序,在某些場(chǎng)合下降序索引將會(huì)起作用。舉個(gè)例子,我們來(lái)查詢一張表并進(jìn)行排序:

      
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select * from test where a between 1 and 100 order by a desc ,b asc ; 已選擇100行。 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 2 Card = 100 Bytes = 400 ) 1 0 SORT( ORDER BY )(Cost = 2 Card = 100 Bytes = 400 ) 2 1 INDEX (RANGE SCAN) OF ' IND_BT ' (NON - UNIQUE ) (Cost = 2 Card = 100 Bytes = 400 )

這里優(yōu)化器首先選擇了一個(gè)索引范圍掃描,然后還有一個(gè)排序的步驟。如果使用了降序索引,排序的過(guò)程會(huì)被取消。

      
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > create index test.ind_desc on test.testrev(a desc ,b asc ); 索引已創(chuàng)建。 SQL > analyze index test.ind_desc compute statistics ; 索引已分析

再來(lái)看下執(zhí)行路徑:

      
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select * from test where a between 1 and 100 order by a desc ,b asc ; 已選擇100行。 Execution Plan (SQL執(zhí)行計(jì)劃,稍后會(huì)講解如何使用)。 -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 2 Card = 100 Bytes = 400 ) 1 0 INDEX (RANGE SCAN) OF ' IND_DESC ' (NON - UNIQUE ) (Cost = 2 Card = 100 Bytes = 400 )

我們看到排序過(guò)程消失了,這是因?yàn)閯?chuàng)建降序索引時(shí)Oracle已經(jīng)把數(shù)據(jù)都按降序排好了。另外一個(gè)需要注意的地方是要設(shè)置init.ora里面的compatible參數(shù)為8.1.0或以上,否則創(chuàng)建時(shí)desc關(guān)鍵字將被忽略。

2.4 位圖索引

位圖索引主要用于決策支持系統(tǒng)或靜態(tài)數(shù)據(jù),不支持行級(jí)鎖定。位圖索引最好用于低cardinality列(即列的唯一值除以行數(shù)為一個(gè)很小的值,接近零),例如又一個(gè)“性別”列,列值有“Male”,“Female”,“Null”等3種,但一共有300萬(wàn)條記錄,那么3/3000000約等于0,這種情況下最適合用位圖索引。

位圖索引可以是簡(jiǎn)單的(單列)也可以是連接的(多列),但在實(shí)踐中絕大多數(shù)是簡(jiǎn)單的。在這些列上多位圖索引可以與AND或OR操作符結(jié)合使用。位圖索引使用位圖作為鍵值,對(duì)于表中的每一數(shù)據(jù)行位圖包含了TRUE(1)、FALSE(0)、或NULL值。位圖索引的位圖存放在B-Tree結(jié)構(gòu)的頁(yè)節(jié)點(diǎn)中。B-Tree結(jié)構(gòu)使查找位圖非常方便和快速。另外,位圖以一種壓縮格式存放,因此占用的磁盤空間比B-Tree索引要小得多。

如果搜索where gender=’Male’,要統(tǒng)計(jì)性別是”Male”的列行數(shù)的話,Oracle很快就能從位圖中找到共3行即第1,9,10行是符合條件的;如果要搜索where gender=’Male’ or gender=’Female’的列的行數(shù)的話,也很容易從位圖中找到共8行即1,2,3,4,7,8,9,10行是符合條件的。如果要搜索表的值的話,那么Oracle會(huì)用內(nèi)部的轉(zhuǎn)換函數(shù)將位圖中的相關(guān)信息轉(zhuǎn)換成rowid來(lái)訪問(wèn)數(shù)據(jù)塊。

2.5 函數(shù)索引

基于函數(shù)的索引也是8i以來(lái)的新產(chǎn)物,它有索引計(jì)算列的能力,它易于使用并且提供計(jì)算好的值,在不修改應(yīng)用程序的邏輯上提高了查詢性能。使用基于函數(shù)的索引有幾個(gè)先決條件:

(1)必須擁有QUERY REWRITE(本模式下)或GLOBAL QUERY REWRITE(其他模式下)權(quán)限。
(2)必須使用基于成本的優(yōu)化器,基于規(guī)則的優(yōu)化器將被忽略。
(3)必須設(shè)置以下兩個(gè)系統(tǒng)參數(shù):

QUERY_REWRITE_ENABLED=TRUE
QUERY_REWRITE_INTEGRITY=TRUSTED

可以通過(guò)alter system set,alter session set在系統(tǒng)級(jí)或線程級(jí)設(shè)置,也可以通過(guò)在init.ora添加實(shí)現(xiàn)。這里舉一個(gè)基于函數(shù)的索引的例子:

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > create index test.ind_fun on test.testindex( upper (a)); 索引已創(chuàng)建。 SQL > insert into testindex values ( ' a ' , 2 ); 已創(chuàng)建 1 行。 SQL > commit ; 提交完成。 SQL > select /**/ /* + RULE */ * FROM test.testindex where upper (a) = ' A ' ; A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (優(yōu)化器選擇了全表掃描) -- ------------------------------------------------------------------ SQL > select * FROM test.testindex where upper (a) = ' A ' ; A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 2 Card = 1 Bytes = 5 ) 1 0 TABLE ACCESS ( BY INDEX ROWID) OF ' TESTINDEX ' (Cost = 2 Card = 1 Bytes = 5 ) 2 1 INDEX (RANGE SCAN) OF ' IND_FUN ' (NON - UNIQUE ) (Cost = 1 Car d = 1 )(使用了ind_fun索引)

3 各種索引的創(chuàng)建方法

(1)*Tree索引。
Create index indexname on tablename(columnname[columnname...])
(2)反向索引。
Create index indexname on tablename(columnname[columnname...]) reverse
(3)降序索引。
Create index indexname on tablename(columnname DESC[columnname...])
(4)位圖索引。
Create BITMAP index indexname on tablename(columnname[columnname...])
(5)函數(shù)索引。
Create index indexname on tablename(functionname(columnname))
注意:創(chuàng)建索引后分析要索引才能起作用。
analyze index indexname compute statistics;

4 各種索引使用場(chǎng)合及建議(1)B*Tree索引。

常規(guī)索引,多用于oltp系統(tǒng),快速定位行,應(yīng)建立于高cardinality列(即列的唯一值除以行數(shù)為一個(gè)很大的值,存在很少的相同值)。
(2)反向索引。
B*Tree的衍生產(chǎn)物,應(yīng)用于特殊場(chǎng)合,在ops環(huán)境加序列增加的列上建立,不適合做區(qū)域掃描。
(3)降序索引。
B*Tree的衍生產(chǎn)物,應(yīng)用于有降序排列的搜索語(yǔ)句中,索引中儲(chǔ)存了降序排列的索引碼,提供了快速的降序搜索。
(4)位圖索引。
位圖方式管理的索引,適用于OLAP(在線分析)和DSS(決策處理)系統(tǒng),應(yīng)建立于低cardinality列,適合集中讀取,不適合插入和修改,提供比B*Tree索引更節(jié)省的空間。
(5)函數(shù)索引。
B*Tree的衍生產(chǎn)物,應(yīng)用于查詢語(yǔ)句條件列上包含函數(shù)的情況,索引中儲(chǔ)存了經(jīng)過(guò)函數(shù)計(jì)算的索引碼值。可以在不修改應(yīng)用程序的基礎(chǔ)上能提高查詢效率。

5 附表(索引什么時(shí)候不工作)

首先要聲明兩個(gè)知識(shí)點(diǎn):

(1)RBO&CBO。
Oracle有兩種執(zhí)行優(yōu)化器,一種是RBO(Rule Based Optimizer)基于規(guī)則的優(yōu)化器,這種優(yōu)化器是基于sql語(yǔ)句寫法選擇執(zhí)行路徑的;另一種是CBO(Cost Based Optimizer)基于規(guī)則的優(yōu)化器,這種優(yōu)化器是Oracle根據(jù)統(tǒng)計(jì)分析信息來(lái)選擇執(zhí)行路徑,如果表和索引沒(méi)有進(jìn)行分析,Oracle將會(huì)使用RBO代替CBO;如果表和索引很久未分析,CBO也有可能選擇錯(cuò)誤執(zhí)行路徑,不過(guò)CBO是Oracle發(fā)展的方向,自8i版本來(lái)已經(jīng)逐漸取代RBO.

(2)AUTOTRACE。
要看索引是否被使用我們要借助Oracle的一個(gè)叫做AUTOTRACE功能,它顯示了sql語(yǔ)句的執(zhí)行路徑,我們能看到Oracle內(nèi)部是怎么執(zhí)行sql的,這是一個(gè)非常好的輔助工具,在sql調(diào)優(yōu)里廣泛被運(yùn)用。我們來(lái)看一下怎么運(yùn)用AUTOTRACE:
① 由于AUTOTRACE自動(dòng)為用戶指定了Execution Plan,因此該用戶使用AUTOTRACE前必須已經(jīng)建立了PLAN_TABLE。如果沒(méi)有的話,請(qǐng)運(yùn)行utlxplan.sql腳本(它在$ORACLE_HOME/rdbms/admin目錄中)。
② AUTOTRACE可以通過(guò)運(yùn)行plustrce.sql腳本(它在$ORACLE_HOME/sqlplus/admin目錄中)來(lái)設(shè)置,用sys用戶登陸然后運(yùn)行plustrce.sql后會(huì)建立一個(gè)PLUSTRACE角色,然后給相關(guān)用戶授予PLUSTRACE角色,然后這些用戶就可以使用AUTOTRACE功能了。
③ AUTOTRACE的默認(rèn)使用方法是set autotrace on,但是這方法不總是適合各種場(chǎng)合,特別當(dāng)返回行數(shù)很多的時(shí)候。Set autotrace traceonly提供了只查看統(tǒng)計(jì)信息而不查詢數(shù)據(jù)的功能。

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > set autotrace on SQL > select * from test; A -- -------- 1 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE 1 0 TABLE ACCESS ( FULL ) OF ' TEST ' Statistics -- -------------------------------------------------------- 0 recursive calls 0 db block gets 0 consistent gets 0 physical reads 0 redo size 0 bytes sent via SQL * Net to client 0 bytes received via SQL * Net from client 0 SQL * Net roundtrips to / from client 0 sorts (memory) 0 sorts ( disk ) rows processed SQL > set autotrace traceonly SQL > select * from test.test; Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE 1 0 TABLE ACCESS ( FULL ) OF ' TEST ' Statistics -- -------------------------------------------------------- 0 recursive calls 0 db block gets 0 consistent gets 0 physical reads 0 redo size 0 bytes sent via SQL * Net to client 0 bytes received via SQL * Net from client 0 SQL * Net roundtrips to / from client 0 sorts (memory) 0 sorts ( disk ) rows processed

Hints是Oracle提供的一個(gè)輔助用法,按字面理解就是‘提示’的意思,確實(shí)它起得作用也是提示優(yōu)化器按它所提供的關(guān)鍵字來(lái)選擇執(zhí)行路徑,特別適用于sql調(diào)整的時(shí)候。使用方法如下:

{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */

具體可參考Oracle SQL Reference。有了前面這些知識(shí)點(diǎn),接下來(lái)讓我們來(lái)看一下什么時(shí)候索引是不起作用的。以下列出幾種情況。

(1)類型不匹配時(shí)。

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > create table test.testindex (a varchar ( 2 ),b number ); 表已創(chuàng)建。 SQL > create index ind_cola on test.testindex(a); 索引已創(chuàng)建。 SQL > insert into test.testindex values ( ' 1 ' , 1 ); 已創(chuàng)建 1 行。 SQL > commit ; 提交完成。 SQL > analyze table test.testindex compute statistics for all indexes; 表已分析。 SQL > set autotrace on ; SQL > select /**/ /* +RULE */ * FROM test.testindex where a = ' 1 ' ;(使用基于rule的優(yōu)化器,數(shù)據(jù)類型匹配的情況下) A B -- ---------- 1 1 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( BY INDEX ROWID) OF ' TESTINDEX ' 2 1 INDEX (RANGE SCAN) OF ' IND_COLA ' (NON - UNIQUE )(使用了索引ind_cola) ―――――――――――――――――――――――――――――――――― SQL > select /**/ /* +RULE */ * FROM test.testindex where a = 1 ;(數(shù)據(jù)類型不匹配的情況) A B -- ---------- 1 1 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (優(yōu)化器選擇了全表掃描)
(2)條件列包含函數(shù)但沒(méi)有創(chuàng)建函數(shù)索引。
        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select /**/ /* + RULE */ * FROM test.testindex where upper (a) = ' A ' ;(使用了函數(shù)upper()在列a上); A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (優(yōu)化器選擇全表掃描) -- -------------------------------------------------------- 創(chuàng)建基于函數(shù)的索引 SQL > create index test.ind_fun on test.testindex( upper (a)); 索引已創(chuàng)建。 SQL > insert into testindex values ( ' a ' , 2 ); 已創(chuàng)建1行。 SQL > commit ; 提交完成。 SQL > select /**/ /* + RULE */ * FROM test.testindex where upper (a) = ' A ' ; A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (在RULE優(yōu)化器下忽略了函數(shù)索引選擇了全表掃描) -- --------------------------------------------------------- SQL > select * FROM test.testindex where upper (a) = ' A ' ; A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 2 Card = 1 Bytes = 5 ) 1 0 TABLE ACCESS ( BY INDEX ROWID) OF ' TESTINDEX ' (Cost = 2 Card = 1 Bytes = 5 ) 2 1 INDEX (RANGE SCAN) OF ' IND_FUN ' (NON - UNIQUE ) (Cost = 1 Car d = 1 )(CBO優(yōu)化器使用了ind_fun索引)

(3)復(fù)合索引中的前導(dǎo)列沒(méi)有被作為查詢條件。

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> 創(chuàng)建一個(gè)復(fù)合索引 SQL > create index ind_com on test.testindex(a,b); 索引已創(chuàng)建。 SQL > select /**/ /* + RULE */ * from test.testindex where a = ' 1 ' ; A B -- ---------- 1 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 INDEX (RANGE SCAN) OF ' IND_COM ' (NON - UNIQUE )(條件列表包含前導(dǎo)列時(shí)使用索引ind_com) SQL > select /**/ /* + RULE */ * from test.testindex where b = 1 ; 未選定行 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (條件列表不包括前導(dǎo)列是選擇全表掃描) -- ---------------------------------------------------------

(4)CBO模式下選擇的行數(shù)比例過(guò)大,優(yōu)化器采取了全表掃描。

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select * from test.testindex where a = ' 1 ' ; A B -- ---------- 1 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 1 Card = 1 Bytes = 5 ) 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (Cost = 1 Card = 1 Bytes = 5 ) (表一共2行,選擇比例為50 % ,所以優(yōu)化器選擇了全表掃描) ―――――――――――――――――――――――――――――――――― 下面增加表行數(shù) SQL > declare i number ; 2 begin 3 for i in 1 .. 100 loop 4 insert into test.testindex values (to_char(i),i); 5 end loop; 6 end ; 7 / PL / SQL 過(guò)程已成功完成。 SQL > commit ; 提交完成。 SQL > select count ( * ) from test.testindex; COUNT ( * ) -- -------- 102 SQL > select * from test.testindex where a = ' 1 ' ; A B -- -- ---------- 1 1 1 2 Execution Plan SELECT STATEMENT Optimizer = CHOOSE (Cost = 1 Card = 1 Bytes = 5 ) 1 0 INDEX (RANGE SCAN) OF ' IND_COM ' (NON - UNIQUE ) (Cost = 1 Card = 1 Bytes = 5 ) (表一共102行,選擇比例為2 / 102 = 2 % ,所以優(yōu)化器選擇了索引掃描)
(5)CBO模式下表很久沒(méi)分析,表的增長(zhǎng)明顯,優(yōu)化器采取了全表掃描。
        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select * from test.testindex where a like ' 1% ' ; A B -- -- ---------- 1 2 1 1 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 100 100 已選擇13行。 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 1 Card = 13 Bytes = 52 ) 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (Cost = 1 Card = 13 Bytes = 52 ) (表一共102行,選擇比例為13 / 102 > 10 % ,優(yōu)化器選擇了全表掃描) ―――――――――――――――――――――――――――――――――― 增加表行數(shù) SQL > declare i number ; 2 begin 3 for i in 200 .. 1000 loop 4 insert into test.testindex values (to_char(i),i); 5 end loop; 6 end ; 7 / PL / SQL 過(guò)程已成功完成。 SQL > commit ; 提交完成。 SQL > select count ( * ) from test.testindex; COUNT ( * ) -- -------- 903 SQL > select * from test.testindex where a like ' 1% ' ; A B -- -- ---------- 1 2 1 1 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 100 100 1000 1000 已選擇14行。 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 1 Card = 13 Bytes = 52 ) 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (Cost = 1 Card = 13 Bytes = 52 ) (表一共903行,選擇比例為14 / 903 < 5 % ,優(yōu)化器選擇了全表掃描,選擇路徑是錯(cuò)誤的) ――――――――――――――――――――――――――――― 給表做分析 SQL > analyze table test.testindex compute statistics for table for all indexed c olumns for all indexes; 表已分析。 SQL > select * from test.testindex where a like ' 1% ' ; A B -- -- ---------- 1 2 1 1 10 10 100 100 1000 1000 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 已選擇14行。 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 4 Card = 24 Bytes = 120 ) 1 0 TABLE ACCESS ( BY INDEX ROWID) OF ' TESTINDEX ' (Cost = 4 Card = 24 Bytes = 120 ) 2 1 INDEX (RANGE SCAN) OF ' IND_COLA ' (NON - UNIQUE ) (Cost = 2 Ca rd = 24 ) (經(jīng)過(guò)分析后優(yōu)化器選擇了正確的路徑,使用了ind_cola索引) ――――――――――――――――――――――――――――――――――

小結(jié)

這篇文章介紹了oracle數(shù)據(jù)庫(kù)中的各種索引,通過(guò)分析它們的結(jié)構(gòu),我們知道了它們的特點(diǎn)和應(yīng)用范圍,同時(shí)介紹了如何去避免索引失效,希望對(duì)大家有所幫助。

Oracle索引分析與比較


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日韩欧美一区二区三区 | 色www 永久免费网站 | 美女被cao的视频免费看 | 国产综合视频在线 | 欧美三级一区二区 | 日韩中文字幕在线观看 | 国产高清在线精品免费 | a视频在线 | 美女被cao的视频免费看 | 日本性网址| 4hu影院最新地址www | 高清不卡一区二区三区 | 欧美福利影院 | 国产精品精品视频 | 全部毛片 | 国产激情视频趣趣在线观看的 | 神马毛片 | 美女视频免费在线观看 | 2021最新国产成人精品免费 | 精品久久洲久久久久护士 | 欧美videossex精品4k | 中文字幕 一区 婷婷 在线 | 国产一区二区日韩欧美在线 | 色综合久久夜色精品国产 | japanese乱子另类 | 在线a人片免费观看国产 | 美女久久 | 国产伦码精品一区二区 | 看全色黄大色大片免费视频 | 欧美日韩小视频 | 一级毛片真人免费观看 | 中文字幕亚洲一区 | 99热在线免费观看 | 欧美啊v在线观看 | 91最新91精品91蝌蚪 | 亚洲精品综合一区二区三区在线 | 黄色在线观看视频免费 | 日韩欧美视频一区二区三区 | 欧美日韩一二三 | 国内精品久久久久久久 | 91精品专区|