RBO上的驅動表選擇

有兩個表 cceu,ac01,現在ac01在aac001,acc002上有唯一索引,cceu在aac001、BCE176有普通索引,在BCC843上有唯一索引。兩表在其餘列上均無索引
1.只有表連接的時候,from順序對執行計劃有影響,選擇from最右邊表爲驅動表
select /*+rule*/ * from AC01 b,CCEU a where a.AAC001=b.AAC001
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (FULL) OF 'CCEU'
   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
   4    3       INDEX (UNIQUE SCAN) OF 'PK_AC01' (UNIQUE)

select /*+rule*/ * from CCEU a,AC01 b where a.AAC001=b.AAC001
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'CCEU'
   2    1     NESTED LOOPS
   3    2       TABLE ACCESS (FULL) OF 'AC01'
   4    2       INDEX (RANGE SCAN) OF 'IDX_CCEU_AAC001' (NON-UNIQUE)

2.如果where有其餘的查詢條件,若條件上有索引,先執行該條件,該表做驅動表;若條件上無索引,以from最右邊表做驅動表
select /*+rule*/ * from CCEU a,AC01 b where  a.AAC001=b.AAC001 and a.BCE176 = 'str2'
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'CCEU'
   3    2       INDEX (RANGE SCAN) OF 'IDX_CCEU_BCE176' (NON-UNIQUE)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
   5    4       INDEX (UNIQUE SCAN) OF 'PK_AC01' (UNIQUE)

select /*+rule*/ * from CCEU a,AC01 b where  a.AAC001=b.AAC001 and a.bcc110 = 'str2'
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'CCEU'
   2    1     NESTED LOOPS
   3    2       TABLE ACCESS (FULL) OF 'AC01'
   4    2       INDEX (RANGE SCAN) OF 'IDX_CCEU_AAC001' (NON-UNIQUE)
 
select /*+rule*/ * from CCEU a,AC01 b where  a.AAC001=b.AAC001  and b.aac005='str1'
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'CCEU'
   2    1     NESTED LOOPS
   3    2       TABLE ACCESS (FULL) OF 'AC01'
   4    2       INDEX (RANGE SCAN) OF 'IDX_CCEU_AAC001' (NON-UNIQUE)

select /*+rule*/ * from  AC01 b,CCEU a where  a.AAC001=b.AAC001  and b.aac005='str1'
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (FULL) OF 'CCEU'
   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
   4    3       INDEX (UNIQUE SCAN) OF 'PK_AC01' (UNIQUE)


3.若兩個表上均有查詢條件,且查詢條件上均有索引且索引類別相同,以from最右邊的表爲驅動表;若查詢條件均無索引,以from最後邊的表的表爲驅動表
select /*+rule*/ * from AC01 b,CCEU a where a.AAC001=b.AAC001 and a.bcc843='str2' and b.aac002='str1'
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'CCEU'
   3    2       INDEX (UNIQUE SCAN) OF 'PK_CCEU' (UNIQUE)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
   5    4       INDEX (UNIQUE SCAN) OF 'IDX_UQ_AC01_AAC002' (UNIQUE)

select /*+rule*/ * from CCEU a,AC01 b where a.AAC001=b.AAC001 and b.aac002='str1' and a.bcc843='str2'、
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
   3    2       INDEX (UNIQUE SCAN) OF 'IDX_UQ_AC01_AAC002' (UNIQUE)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'CCEU'
   5    4       INDEX (UNIQUE SCAN) OF 'PK_CCEU' (UNIQUE)

若兩表上的索引不同,以索引級別高的表作爲驅動表,與from順序與where順序無影響
select /*+rule*/ * from CCEU a,AC01 b where a.AAC001=b.AAC001 and b.aac002='str1' and a.bce176='str2'
select /*+rule*/ * from CCEU a,AC01 b where a.AAC001=b.AAC001 and a.bce176='str2' and b.aac002='str1'
select /*+rule*/ from AC01 b,CCEU a where a.AAC001=b.AAC001 and b.aac002='str1' and a.bce176= 'str2'
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
   3    2       INDEX (UNIQUE SCAN) OF 'IDX_UQ_AC01_AAC002' (UNIQUE)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'CCEU'
   5    4       AND-EQUAL
   6    5         INDEX (RANGE SCAN) OF 'IDX_CCEU_AAC001' (NON-UNIQUE)
   7    5         INDEX (RANGE SCAN) OF 'IDX_CCEU_BCE176' (NON-UNIQUE)

若where上有多個索引列,仍以最高等級的索引爲驅動表,若最高等級相同,以from右邊表爲驅動表,與索引數量無關。
select /*+rule*/ * from CCEU a,AC01 b where a.AAC001=b.AAC001 and b.aac002='str1' and a.bce176= 'str2' and a.bcc843='str3'
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
   3    2       INDEX (UNIQUE SCAN) OF 'IDX_UQ_AC01_AAC002' (UNIQUE)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'CCEU'
   5    4       INDEX (UNIQUE SCAN) OF 'PK_CCEU' (UNIQUE)
 
但是如果調整表連接的位置,會改變索引執行順序,持續瞭解中。。。
select /*+rule*/ * from CCEU a,AC01 b where   a.bce176='str2' and b.aac002='str1' and a.AAC001=b.AAC001
執行計劃
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: RULE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'AC01'
   3    2       INDEX (UNIQUE SCAN) OF 'IDX_UQ_AC01_AAC002' (UNIQUE)
   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'CCEU'
   5    4       AND-EQUAL
   6    5         INDEX (RANGE SCAN) OF 'IDX_CCEU_BCE176' (NON-UNIQUE)
   7    5         INDEX (RANGE SCAN) OF 'IDX_CCEU_AAC001' (NON-UNIQUE)

發佈了26 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章