oracle函式索引
首相,建立一張表,只有很少量的記錄狀態為'N',而我們只需要查詢狀態為'N'的記錄
SQL> create table test as select 'Y' flag,o.* from dba_objects o;
SQL> update test set flag='N' where rownum<10;
已更新9行。
SQL> commit;
提交完成。
然後分別建立函式索引和普通索引
SQL> create index inx_flag_n on test(decode(flag,'N','N',null));
索引已建立。
SQL> create index inx_flag on test(flag);
索引已建立。
SQL> exec dbms_stats.gather_schema_stats('LIHUILIN');
PL/SQL 過程已成功完成。
使用函式索引查詢狀態為"N"的記錄,其結果如下
SQL> select flag,object_name from test where decode(flag,'N','N',null)='N';
已選擇9行。
執行計劃
----------------------------------------------------------
Plan hash value: 905922165
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 261 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 9 | 261 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | INX_FLAG_N | 9 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access(DECODE("FLAG",'N','N',NULL)='N')
統計資訊
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
627 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
9 rows processed
如果使用普通索引,其結果如下。
SQL> select flag,object_name from test where flag='N';
已選擇9行。
執行計劃
----------------------------------------------------------
Plan hash value: 1357081020
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 36274 | 956K| 296 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| TEST | 36274 | 956K| 296 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("FLAG"='N')
統計資訊
----------------------------------------------------------
1 recursive calls
0 db block gets
1059 consistent gets
0 physical reads
0 redo size
627 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
9 rows processed
由此可見,在這種場景下,普通索引甚至無法發生作用,而函式索引,則可以最佳化查詢。
SQL> create table test as select 'Y' flag,o.* from dba_objects o;
SQL> update test set flag='N' where rownum<10;
已更新9行。
SQL> commit;
提交完成。
然後分別建立函式索引和普通索引
SQL> create index inx_flag_n on test(decode(flag,'N','N',null));
索引已建立。
SQL> create index inx_flag on test(flag);
索引已建立。
SQL> exec dbms_stats.gather_schema_stats('LIHUILIN');
PL/SQL 過程已成功完成。
使用函式索引查詢狀態為"N"的記錄,其結果如下
SQL> select flag,object_name from test where decode(flag,'N','N',null)='N';
已選擇9行。
執行計劃
----------------------------------------------------------
Plan hash value: 905922165
------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9 | 261 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 9 | 261 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | INX_FLAG_N | 9 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access(DECODE("FLAG",'N','N',NULL)='N')
統計資訊
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
627 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
9 rows processed
如果使用普通索引,其結果如下。
SQL> select flag,object_name from test where flag='N';
已選擇9行。
執行計劃
----------------------------------------------------------
Plan hash value: 1357081020
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 36274 | 956K| 296 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| TEST | 36274 | 956K| 296 (1)| 00:00:04 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("FLAG"='N')
統計資訊
----------------------------------------------------------
1 recursive calls
0 db block gets
1059 consistent gets
0 physical reads
0 redo size
627 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
9 rows processed
由此可見,在這種場景下,普通索引甚至無法發生作用,而函式索引,則可以最佳化查詢。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-775791/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle之函式索引Oracle函式索引
- Oracle索引梳理系列(六)- Oracle索引種類之函式索引Oracle索引函式
- Oracle基於函式的索引Oracle函式索引
- 函式索引陷阱函式索引
- 資料型別與函式索引-Oracle篇資料型別函式索引Oracle
- Oracle優化案例-自定義函式索引(五)Oracle優化函式索引
- 函式索引使用細節——自定義函式的索引化函式索引
- Oracle 19c中基於函式的索引Oracle函式索引
- 說說函式索引函式索引
- 索引中使用函式索引函式
- 基於函式的索引函式索引
- 函式索引的問題函式索引
- deterministic function 函式索引Function函式索引
- 函式索引的儲存函式索引
- SQL優化--函式索引SQL優化函式索引
- sequence 和索引函式呼叫索引函式
- 【函式】ORACLE函式大全函式Oracle
- Oracle中利用函式索引處理資料傾斜案例Oracle函式索引
- Oracle聚合函式/分析函式Oracle函式
- MySQL函式索引及優化MySql函式索引優化
- 索引ROWID轉換函式索引函式
- 【函式】Oracle EXTRACT()函式與to_char() 函式函式Oracle
- oracle 函式Oracle函式
- oracle or 函式Oracle函式
- Oracle函式Oracle函式
- Oracle中B-Tree、Bitmap和函式索引使用案例總結Oracle函式索引
- 【函式】Oracle函式系列(2)--數學函式及日期函式函式Oracle
- 【函式】oracle nvl2 函式函式Oracle
- 複合索引與函式索引優化一例索引函式優化
- OCP之基於函式的索引函式索引
- 關於函式索引的問題?函式索引
- 函式索引產生隱藏列函式索引
- 建立函式索引須知DETERMINISTIC函式索引
- Oracle 函式大全(字串函式,數學函式,日期函式,邏輯運算函式,其他函式)Oracle函式字串
- Oracle分析函式與視窗函式Oracle函式
- oracle函式大全-字串處理函式Oracle函式字串
- Oracle分析函式七——分析函式案例Oracle函式
- 函式索引的使用細節——常數表示式函式索引