2008年6月18日 星期三

use index or not II using Oracle10g

/* 將先前的TESTIDX_IDX DROP */

SQL>DROP INDEX TESTIDX_IDX;

/* 以總合建一個INDEX */

SQL>CREATE INDEX TESTIDX_I ON TESTIDX(CATEGORY+X+Y);

/* 使用SQLPLUS並開啟TRACE */

SQL> set autotrace traceonly explain

/* 看總和為條件的查詢結果 */

SQL> select * from testidx where category+x+y=9;

執行計畫
----------------------------------------------------------
Plan hash value: 3683099191

----------------------------------------------------------------------------
| Id | Operation         | Name |Rows| Bytes |Cost(%CPU)|Time |
----------------------------------------------------------------------------
| 0 |SELECT STATEMENT      |     | 4 | 208  | 7 0)|00:00:01 |
| 1 |TABLE ACCESS BY INDEX ROWID|TESTIDX | 4 | 208 | 7 (0)|00:00:01 |
|* 2 |INDEX RANGE SCAN      |TESTIDX_I| 40|    | 1 (0)|00:00:01|
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
  2 - access("CATEGORY"+"X"+"Y"=9)
Note
-----
  - dynamic sampling used for this statement


/* 再看看各別為條件的查詢結果 */

SQL> select * from testidx where category=99 and x=99 and y=99;

執行計畫
----------------------------------------------------------
Plan hash value: 3565063929

----------------------------------------------------------------------
| Id |Operation     | Name  |Rows|Bytes|Cost(%CPU)| Time  |
----------------------------------------------------------------------
| 0 |SELECT STATEMENT  |     | 1 | 52 |  8 (0) | 00:00:01 |
|* 1 |TABLE ACCESS FULL | TESTIDX | 1 | 52 |  8 (0) | 00:00:01 |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
 1 - filter("CATEGORY"=99 AND "X"=99 AND "Y"=99)
Note
-----
 - dynamic sampling used for this statement

SQL> set autotrace off