ORACLE绑定变量BINDPEEKING(二)

2014-11-24 17:04:17 · 作者: · 浏览: 2
SQL_ID 3rg5r8sghcvb3, 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 | ---------------------------------------------------------------------------------------------------- Peeked Binds (identified by position): -------------------------------------- 1 - :V (NUMBER): 2 --绑定变量窥探,绑定变量会影响最初硬解析的执行计划 Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("RECORD_TYPE"=:V) 已选择49行。 使用绑定变量窥测的好处是:可以帮助优化器在第一次硬解析时选择最优的执行计划。但是同时这也是其弊端:在第一次硬解析后,后面发生的所有解析都会使用第一次硬解析生成的执行计划,如果数据的分布是均匀的,问题不大,如果数据分布式倾斜的,那么第一次硬解析生成的执行计划未必是最优的,甚至可能是非常糟糕的。例如:
SQL> show parameter optimizer_feat

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
optimizer_features_enable	     string	 11.2.0.3.1
SQL> alter system flush shared_pool;

系统已更改。

SQL> var v number;
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); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------------------------- SQL_ID 3rg5r8sghcvb3, 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 | ---------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - filter("RECORD_TYPE"=:V) 已选择19行。 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); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------------------------- SQL_ID 3rg5r8sghcvb3, child number 0 ------------------------------------- select count(*) from acs_test_tab where record_type = :v Plan hash value: 2957754476 ---------------------------------------------------------------------------------------------------- | Id | Operation