【每日一摩斯】-Index Skip Scan Feature (212391.1)

bisal發表於2013-09-07

INDEX Skip Scan,也就是索引快速掃描,一般是指謂詞中不帶複合索引第一列,但掃描索引塊要快於掃描表的資料塊,此時CBO會選擇INDEX SS的方式。

官方講的,這個概念也好理解,如果將複合索引看做是一個分割槽表,其中分割槽主鍵(這裡指的是複合索引的首列)定義了儲存於此的分割槽資料。在每個鍵(首列)下的每行資料都將按照此鍵排序。因此在SS,首列可以被跳過,非首列可以作為邏輯子索引訪問。因此一個“正常”的索引訪問可以忽略首列。

複合索引被邏輯地切分成更小的子索引。邏輯子索引的個數取決於初始列的cardinality。因此儘管首列未出現在謂詞中,也可能使用這個索引。、

另外,需要吧補充一點:當複合索引的第一個欄位的值重複率非常低時,掃描索引的效率會比全表掃描更高,這是CBO才可能會選擇使用INDEX Skip Scan的方式訪問資料。


這裡比較奇怪的是:


使用9i時,未使用INDEX Skip Scan:

SQL> create table at2(a varchar2(3),b varchar2(10),c varchar2(5));
Table created.

SQL> begin
  2    for i in 1..1000
  3    loop
  4    insert into at2 values('M', i, 'M');
  5    insert into at2 values('F', i, 'F');
  6    end loop;
  7    end;
  8  /
PL/SQL procedure successfully completed.

SQL> create index at2_i on at2(a,b,c);
Index created.

SQL> exec dbms_stats.gather_table_stats(OWNNAME => NULL, TABNAME => 'at2', CASCADE => TRUE, method_opt => 'FOR ALL COLUMNS SIZE 1');
PL/SQL procedure successfully completed.


SQL> set autotrace traceonly


SQL> select * from at2 where b='352';
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=2 Bytes=14)
   1    0   INDEX (FAST FULL SCAN) OF 'AT2_I' (NON-UNIQUE) (Cost=2 Car
          d=2 Bytes=14)
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
         10  consistent gets
          0  physical reads
          0  redo size
        447  bytes sent via SQL*Net to client
        587  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          2  rows processed


使用10g的,則使用了INDEX Skip Scan:

SQL> select * from full_tbl where object_name='TEST';
Execution Plan
----------------------------------------------------------
Plan hash value: 1293869270
------------------------------------------------------------------------------
| Id  | Operation         | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |          |     2 |    58 |    55   (2)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| FULL_TBL |     2 |    58 |    55   (2)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("OBJECT_NAME"='TEST')

Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
        230  consistent gets
          0  physical reads
          0  redo size
        585  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed


難道9i和10g在選擇INDEX Skip Scan還有什麼不同麼?

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

相關文章