ORACLE绑定变量BINDPEEKING(一)

2014-11-24 17:04:17 · 作者: · 浏览: 3

ORACLE 在9i之后引入了bind peeking,通过bind peeking,oracle可以在硬解析的时候窥探绑定变量的值,并根据当前绑定变量的值生成执行计划。在oracle 9i之前的版本中,oracle仅仅通过统计信息来生成执行计划。

下面看一下不同版本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_xplan.display_cursor(null,null,'advanced'));

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID	3rg5r8sghcvb3, 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='11.2.0.3.1';

系统已更改。

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_xplan.display_cursor(null,null,'advanced')); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------------------------- SQL_ID 3rg5r8sghcvb3, 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_xplan.display_cursor(null,null,'advanced')); PLAN_TABLE_OUTPUT ----------------------------------------------------------------------------------------------------