當前位置:才華齋>IT認證>Oracle認證>

Oracle認證:ORACLE繫結變數BINDPEEKING

Oracle認證 閱讀(1.44W)

ORACLE 在9i之後引入了bind peeking,通過bind peeking,oracle可以在硬解析的時候窺探繫結變數的值,並根據當前繫結變數的值生成執行計劃。在oracle 9i之前的版本中,oracle僅僅通過統計資訊來生成執行計劃。

Oracle認證:ORACLE繫結變數BINDPEEKING

下面看一下不同版本oracle下繫結變數對執行計劃的影響

SQL> alter sysTEM flush shared_pool;

系統已更改。

SQL> alter system set optimizer_features_enable='8.1.7';

系統已更改。

SQL> var v number;

SQL> exec :v := 1;

PL/SQL 過程已成功完成。

SQL> select count(*) from acs_test_tab where record_type = :v;

COUNT(*)

----------

1

SQL> select * from table(dbms_lay_cursor(null,null,'advanced'));

PLAN_TABLE_OUTPUT

----------------------------------------------------------------------------------------------------

SQL_ID3rg5r8sghcvb3, child number 0

-------------------------------------

select count(*) from acs_test_tab where record_type = :v

Plan hash value: 2956728990

--------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost |

--------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | | | 3 |

| 1 | SORT AGGREGATE | | 1 | 4 | |

|* 2 | INDEX RANGE SCAN| ACS_TEST_TAB_RECORD_TYPE_I | 2 | 8 | 3 |

--------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

2 - access("RECORD_TYPE"=:V)

已選擇47行。

SQL> alter system flush shared_pool;

系統已更改。

SQL> alter system set optimizer_features_enable='';

系統已更改。

SQL> var v number;

SQL> exec :v := 1;

PL/SQL 過程已成功完成。

SQL> select count(*) from acs_test_tab where record_type = :v;

COUNT(*)

----------

1

SQL> select * from table(dbms_lay_cursor(null,null,'advanced'));

PLAN_TABLE_OUTPUT

----------------------------------------------------------------------------------------------------

SQL_ID3rg5r8sghcvb3, child number 0

-------------------------------------

select count(*) from acs_test_tab where record_type = :v

Plan hash value: 2956728990

------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | | | 3 (100)| |

| 1 | SORT AGGREGATE | | 1 | 4 | | |

|* 2 | INDEX RANGE SCAN| ACS_TEST_TAB_RECORD_TYPE_I | 1 | 4 | 3 (0)| 00:00:01 |

------------------------------------------------------------------------------------------------

Peeked Binds (identified by position):

--------------------------------------

1 - :V (NUMBER): 1 --繫結變數窺探

Predicate Information (identified by operation id):

---------------------------------------------------

2 - access("RECORD_TYPE"=:V)

已選擇49行。

SQL> alter system flush shared_pool;

系統已更改。

SQL> exec :v := 2;

PL/SQL 過程已成功完成。

SQL> select count(*) from acs_test_tab where record_type = :v;

COUNT(*)

----------

50000

SQL> select * from table(dbms_lay_cursor(null,null,'advanced'));

PLAN_TABLE_OUTPUT

----------------------------------------------------------------------------------------------------

SQL_ID3rg5r8sghcvb3, child number 0

-------------------------------------

select count(*) from acs_test_tab where record_type = :v

Plan hash value: 2957754476

----------------------------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | | | 136 (100)| |

| 1 | SORT AGGREGATE | | 1 | 4 || |

|* 2 | INDEX FAST FULL SCAN| ACS_TEST_TAB_RECORD_TYPE_I | 48031 | 187K| 136 (1)| 00:00:02 |