Oracle认证 百分网手机站

Oracle认证:ORACLE绑定变量BINDPEEKING

时间:2017-11-18 15:29:55 Oracle认证 我要投稿

Oracle认证:ORACLE绑定变量BINDPEEKING

  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_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='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_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_xplan.display_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 |