网站首页 语言 会计 电脑 医学 资格证 职场 文艺体育 范文
当前位置:书香门第 > IT认证 > Oracle认证

Oracle认证:ORACLE绑定变量BINDPEEKING

栏目: Oracle认证 / 发布于: / 人气:1.51W

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 |