Oracle訪問索引的執行計劃(三)

stonebox1122發表於2017-05-28

Oracle訪問索引的執行計劃(一)
Oracle訪問索引的執行計劃(二)


當需要獲取某個欄位的全部資料時,如果該欄位非空且有索引,或者透過where條件將空值排除掉,則可能會使用索引全掃描(INDEX FULL SCAN)。

 

檢視HR使用者下EMPLOYEES表的LAST_NAME欄位的索引,為非唯一索引。
SQL> select a.table_name,column_name,a.index_name,index_type,uniqueness from user_indexes a,user_ind_columns b where a.index_name=b.index_name and a.table_name='EMPLOYEES' and column_name='LAST_NAME';

TABLE_NAME      COLUMN_NAME     INDEX_NAME      INDEX_TYPE      UNIQUENES
--------------- --------------- --------------- --------------- ---------
EMPLOYEES       LAST_NAME       EMP_NAME_IX     NORMAL          NONUNIQUE

 

檢視HR使用者下EMPLOYEES表的LAST_NAME欄位為非空。
SQL> select table_name,column_name,nullable from user_tab_columns where table_name='EMPLOYEES' and column_name='LAST_NAME';

TABLE_NAME                     COLUMN_NAME                    N
------------------------------ ------------------------------ -
EMPLOYEES                      LAST_NAME                      N

 

檢視獲取last_name這個欄位的所有記錄的執行計劃:
SQL> select last_name from employees;

107 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 2228653197

--------------------------------------------------------------------------------
| Id  | Operation        | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |             |   107 |   856 |     1   (0)| 00:00:01 |
|   1 |  INDEX FULL SCAN | EMP_NAME_IX |   107 |   856 |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------

 

檢視HR使用者下EMPLOYEES表的DEPARTMENT_ID欄位的索引,為非唯一索引。
SQL> select a.table_name,column_name,a.index_name,index_type,uniqueness from user_indexes a,user_ind_columns b where a.index_name=b.index_name and a.table_name='EMPLOYEES' and column_name='DEPARTMENT_ID';

TABLE_NAME      COLUMN_NAME     INDEX_NAME           INDEX_TYPE      UNIQUENES
--------------- --------------- -------------------- --------------- ---------
EMPLOYEES       DEPARTMENT_ID   EMP_DEPARTMENT_IX    NORMAL          NONUNIQUE

 

檢視HR使用者下EMPLOYEES表的DEPARTMENT_ID欄位,可以為空。
SQL> select table_name,column_name,nullable from user_tab_columns where table_name='EMPLOYEES' and column_name='DEPARTMENT_ID';

TABLE_NAME      COLUMN_NAME     N
--------------- --------------- -
EMPLOYEES       DEPARTMENT_ID   Y

 

檢視獲取department_id這個欄位的所有非空記錄的執行計劃:

SQL> select department_id from employees where department_id is not null;

106 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3420648541

--------------------------------------------------------------------------------------
| Id  | Operation        | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                   |   106 |   318 |     1   (0)| 00:00:01 |
|*  1 |  INDEX FULL SCAN | EMP_DEPARTMENT_IX |   106 |   318 |     1   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

 

從上面的執行計劃可以看出,由於索引鍵值就是查詢結果,所有就不需要回表了。
索引全掃描會對目標索引的所有葉子塊從左到右依次順序掃描,所以它的結果是有序的。也就是說索引全掃描是不能夠並行執行的,並且通常情況下使用的是單塊讀,產生db file sequential reads事件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28536251/viewspace-2140022/,如需轉載,請註明出處,否則將追究法律責任。

相關文章