Oracle常見索引掃描方式總結

目錄

一、簡介

二、索引唯一掃描

三、索引範圍掃描

 四、索引全掃描

五、索引快速全掃描

六、索引跳躍式掃描

 七、總結

一、簡介

Oracle提供了五種索引掃描類型,根據具體索引類型、數據分佈、約束條件以及where限制的不同進行選擇:

  1. 索引唯一掃描(index unique scan)
  2. 索引範圍掃描(index range scan)
  3. 索引全掃描(index full scan)
  4. 索引快速掃描(index fast full scan)
  5. 索引跳躍掃描(index skip scan)

下面我們依次對每種方式進行詳細的說明。

二、索引唯一掃描

簡稱:index unique scan

通過唯一索引查找一個數值經常返回單個ROWID。如果該唯一索引有多個列組成(即組合索引),則至少要有組合索引的引導列參與到該查詢中。

如創建一個索引:

create index idx_test on emp(ename, deptno, loc)

則下面的語句可以使用該索引:

select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’

如果該語句只返回一行,則存取方法稱爲索引唯一掃描。但是注意下面的語句不會使用該索引,因爲where子句種沒有引導列。

select ename from emp where deptno = ‘DEV’

如果存在UNIQUE 或PRIMARY KEY 約束(它保證了語句只存取單行)的話,Oracle經常實現唯一性掃描,索引唯一性掃描的結果最多返回一條記錄。

下面通過一個簡單的示例說明索引唯一掃描的場景:

【a】表結構說明:RWID、XSID、CPHJID三個字段組成組合唯一索引

【b】SQL語句 : 使用到了組合索引的三個字段,顯然這三個字段組合起來能夠唯一確定一條數據,所以使用到了索引唯一掃描。

explain plan for select * from zhxg_zhcp_hjcpxq t where 
 t.rwid = '6d5ca4e1-fe93-4447-933a-e9ae5cb9cf31'
  and t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1' 
 and t.cphjid = '529e35bc-1e24-4dc9-ad0e-930c4372e40f';
select * from table(dbms_xplan.display);

【c】SQL執行計劃

三、索引範圍掃描

簡稱:index range scan

  1. 索引是組合索引,而且select ename from emp where ename = ‘JACK’ and deptno = ‘DEV’語句返回多行數據,雖然該語句還是使用該組合索引進行查詢,可此時的存取方法稱爲索引範圍掃描。
  2. 當掃描對象是唯一性索引時,此時目標sql的where條件一定是範圍查詢(如between..and...、>、<、<>、>=、<=等);
  3. 當掃描對象是非唯一性索引時,此時目標sql的where條件沒有限制(可以是等值,也可以是範圍查詢)

下面通過一個簡單的示例說明索引範圍掃描的場景: 

explain plan for select * from vc_zhxg_xsxx_xsjbxx;

select * from table(dbms_xplan.display);

【a】表結構說明

【b】執行計劃

【c】索引範圍掃描小總結:

使用index rang scan的3種情況:

  • (a) 在唯一索引列上使用了range操作符(> < <> >= <= between);
  • (b) 在組合索引上,只使用部分列進行查詢,導致查詢出多行;
  • (c) 對非唯一索引列上進行的任何查詢;

 四、索引全掃描

簡稱:index full scan

與全表掃描TABLE ACCESS FULL對應,也有相應的全Oracle索引掃描。在某些情況下,可能進行全Oracle索引掃描而不是範圍掃描,需要注意的是全Oracle索引掃描只在CBO模式下才有效。 CBO根據統計數值得知進行全Oracle索引掃描比進行全表掃描更有效時,才進行全Oracle索引掃描,而且此時查詢出的數據都必須從索引中可以直接得到。

下面通過一個簡單的示例說明索引全掃描的場景: 

【a】表結構說明:ND、XSID兩個字段組成組合唯一索引

【b】SQL語句 : 注意order by t.nd, t.xsid

explain plan for select * from zhxg_lx_jcsj_lxxsgl t order by t.nd,t.xsid;

select * from table(dbms_xplan.display);

【c】執行計劃

五、索引快速全掃描

簡稱:index fast full scan

掃描索引中的所有的數據塊,與 index full scan很類似,但是一個顯著的區別就是它不對查詢出的數據進行排序,即數據不是以排序順序被返回。在這種存取方法中,可以使用多塊讀功能,也可以使用並行讀入,以便獲得最大吞吐量與縮短執行時間。

注意點:

索引快速全掃描的執行結果不一定是有序的。這是因爲索引快速全掃描時Oracle是根據索引行在磁盤上的物理存儲順序來掃描,而不是根據索引行的邏輯順序來掃描的,所以掃描結果纔不一定有序(對於單個索引葉子塊中的索引行而言,其物理存儲順序和邏輯存儲順序一致;但對於物理存儲位置相鄰的索引葉子塊而言,塊與塊之間索引行的物理存儲順序則不一定在邏輯上有序)。

下面通過一個簡單的示例說明索引快速全掃描的場景: 

【a】表結構說明:

【b】SQL語句 

explain plan for select nd,xsid from zhxg_lx_jcsj_lxxsgl t;

select * from table(dbms_xplan.display);

【c】執行計劃

六、索引跳躍式掃描

簡稱:INDEX SKIP SCAN

主要發生在多個列建立的組合索引上,如果SQL中謂詞條件只包含索引中的部分列,並且這些列不是建立索引時的第一列時,就可能發生INDEX SKIP SCAN。這裏SKIP的意思是因爲查詢條件沒有第一列或前面幾列,被忽略了。

下面通過一個簡單的示例說明索引跳躍式掃描的場景: 

【a】表結構說明:RWID、XSID、CPHJID三個字段組成一個唯一組合索引

 

 【b】SQL語句:使用到了索引列的第一列RWID和第二列XSID

explain plan for select * from zhxg_zhcp_hjcpxq t where 
 t.rwid = '6d5ca4e1-fe93-4447-933a-e9ae5cb9cf31'
  and t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1';
select * from table(dbms_xplan.display);

【c】執行計劃:很顯然,肯定走索引,而且是索引範圍掃描

觀察下面的SQL,使用到了RWID、XSID、CPHJID三個索引,顯然三者組合唯一,使用到唯一索引掃描。

explain plan for select * from zhxg_zhcp_hjcpxq t where 
 t.rwid = '6d5ca4e1-fe93-4447-933a-e9ae5cb9cf31'
  and t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1' 
 and t.cphjid = '529e35bc-1e24-4dc9-ad0e-930c4372e40f';
select * from table(dbms_xplan.display);

再觀察下面的SQL,使用到組合索引的第二列XSID和第三列CPHJID,注意到這裏跳過了第一列引導列索引RWID,這其實就是索引跳躍現象,顯然使用到的就是索引跳躍式掃描,在開發中我們應儘量避免出現索引跳躍。

explain plan for select * from zhxg_zhcp_hjcpxq t where 
 t.xsid = '5044889DBBF944E2B42B9E15E9F1CDA1' 
 and t.cphjid = '529e35bc-1e24-4dc9-ad0e-930c4372e40f';
select * from table(dbms_xplan.display);

 七、總結

以上就是關於Oracle中常見的五種索引掃描方式的總結,主要注意下面幾點,能有效提高SQL查詢效率。

  1. 儘可能使SQL走唯一索引掃描和索引範圍掃描;
  2. 至於索引全掃描可能遇到的較少些,一般出現了再具體分析下;
  3. 儘量避免出現索引跳躍現象,儘量滿足Oracle索引最左前綴匹配原則;

參考資料:

https://www.cnblogs.com/zwl715/p/3601137.html

https://blog.csdn.net/choubei6141/article/details/100741178

https://www.cnblogs.com/yumiko/p/5972246.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章