關於Inlist iterator操作的一點認識
Inlist iterator操作是oracle為inlist查詢提供的一種解決方案:
即查詢謂詞為:where indexed_column in (:1, :2, :3)
對於這種查詢,oracle一般有兩種解決方法:inlist iterator 和 concatenation.
對於concatenation,就是為inlist中的每個值執行一次索引查詢,然後將結果集採用union all的方式合併。
而inlist iterator,oracle的解釋是“The INLIST ITERATOR operation iterates over the next operation in the plan for each value in the IN-list predicate.”。從這個解釋中恐怕也很理解其內部究竟使用了什麼方法來做這種結果的迭代。但按oracle的說法是這種演算法更高效。實際測試中也會發現inlist iterator操作的cpu cost和buffer reads更低。
select /*+ gather_plan_statistics */ NAME from t1 where id in (1,4,5);
SQL> sELECT * FROM table(dbms_xplan.display_cursor(null,null,'cost iostats last'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID c71htttwfy714, child number 0
-------------------------------------
select /*+ gather_plan_statistics */ NAME from t1 where id in (1,4,5)
Plan hash value: 1916009008
--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | Cost (%CPU)| A-Rows | A-Time | Buffers |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 4 (100)| 30 |00:00:00.01 | 12 |
| 1 | INLIST ITERATOR | | 1 | | | 30 |00:00:00.01 | 12 |
| 2 | TABLE ACCESS BY INDEX ROWID| T1 | 3 | 30 | 4 (0)| 30 |00:00:00.01 | 12 |
|* 3 | INDEX RANGE SCAN | IND_T1 | 3 | 30 | 3 (0)| 30 |00:00:00.01 | 8 |
--------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access(("ID"=1 OR "ID"=4 OR "ID"=5))
20 rows selected.
SQL> select /*+ gather_plan_statistics use_concat */ NAME from t1 where id in (1,4,5);
SQL> SELECT * FROM table(dbms_xplan.display_cursor(null,null,'cost iostats last'));
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SQL_ID f2s897x1krsxw, child number 0
-------------------------------------
select /*+ gather_plan_statistics use_concat */ NAME from t1 where id in (1,4,5);
Plan hash value: 1740722098
-----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | Cost (%CPU)| A-Rows | A-Time | Buffers | Reads |
-----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 6 (100)| 30 |00:00:00.07 | 13 | 5 |
| 1 | CONCATENATION | | 1 | | | 30 |00:00:00.07 | 13 | 5 |
| 2 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 10 | 2 (0)| 10 |00:00:00.07 | 5 | 3 |
|* 3 | INDEX RANGE SCAN | IND_T1 | 1 | 10 | 1 (0)| 10 |00:00:00.04 | 3 | 2 |
| 4 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 10 | 2 (0)| 10 |00:00:00.01 | 5 | 0 |
|* 5 | INDEX RANGE SCAN | IND_T1 | 1 | 10 | 1 (0)| 10 |00:00:00.01 | 3 | 0 |
| 6 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 10 | 2 (0)| 10 |00:00:00.02 | 3 | 2 |
|* 7 | INDEX RANGE SCAN | IND_T1 | 1 | 10 | 1 (0)| 10 |00:00:00.01 | 2 | 1 |
-----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("ID"=5)
5 - access("ID"=4)
7 - access("ID"=1)
27 rows selected.
其他:
a> 若希望禁用inlist iterator,可設定10157等待事件:
alter session set events ‘10157 trace name context forever, level 1’;
b> use_concat也可用來禁用inlist iterator操作,而強制其使用concatenation操作。但實際中會發現該hint常常不能如預期地生效,所以使用後還要注意驗證結果是否如預期發生了變化。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27243841/viewspace-1271735/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於INLIST ITERATOR的幾個測試
- BITMAP索引的INLIST ITERATOR與BITMAP OR索引
- 關於 Laravel 框架事件系統的一點認識Laravel框架事件
- 【Linux】關於bind_ip的一點認識Linux
- 關於enqueue的一些認識ENQ
- 對於HOOK函式的一點認識Hook函式
- 關於 MySQL 索引的一些認識MySql索引
- 對於HOOK函式的一點認識 (轉)Hook函式
- 關於跨平臺的一些認識
- 關於負載均衡的一些認識負載
- 關於range的一個知識點
- 關於UI設計行業的認識再到認識UI行業
- java 關於操作Collection的一點說明Java
- 關於AP的一些知識點
- 關於/*+append*/的一點小常識APP
- 關於NAND FLASH解釦的認識NaN
- 關於animation和transition一點知識
- 關於網頁的一些小知識點網頁
- 一些關於IO流的知識點
- 關於不完全型別的認識型別
- 關於Async、Await的一些知識點AI
- 關於處理死鎖的一點小知識
- 關於Struts的logic:iterator標籤
- jQuery關於DOM操作節點一些方法jQuery
- 關於MFC操作Excel的幾點心得Excel
- 關於洗牌演算法的錯誤認識演算法
- 關於dbms_metadata.get_ddl的認識
- 關於瀏覽器外掛的初步認識瀏覽器
- Python中關於Thread的一點小知識Pythonthread
- 關於latch的一點點理解
- 關於專案管理的知識點專案管理
- React相關知識點:關於ReduxReactRedux
- 關於vmware下網路卡型別的個人認識型別
- 關於高防伺服器的一些知識點伺服器
- 關於table的一些操作
- 我來提個關於Iterator的小問題
- 關於PHP 的一點點小分享PHP
- 關於Java兩點需要更新的知識Java