Heim > Datenbank > MySQL-Tutorial > ORACLE绑定变量BINDPEEKING

ORACLE绑定变量BINDPEEKING

WBOY
Freigeben: 2016-06-07 15:03:38
Original
1164 Leute haben es durchsucht

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 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

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入


    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 |
    ----------------------------------------------------------------------------------------------------
    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_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 |
    ----------------------------------------------------------------------------------------------------
    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_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 |
    ----------------------------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    2 - filter("RECORD_TYPE"=:V)
    已选择19行。
    SQL> select count(*) from acs_test_tab where record_type = 1;
    COUNT(*)
    ----------
    1
    SQL> select * from table(dbms_xplan.display_cursor);
    PLAN_TABLE_OUTPUT
    ----------------------------------------------------------------------------------------------------
    SQL_ID1pxm87f6yd0bp, child number 0
    -------------------------------------
    select count(*) from acs_test_tab where record_type = 1
    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 |
    ------------------------------------------------------------------------------------------------
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    2 - access("RECORD_TYPE"=1)
    已选择19行。
    对于变量v的取值为1的执行计划和采用常量1的执行计划性能差距还是比较大的。
    总结:oracle在9i后引入变量窥测技术,该技术对于数据分布均匀的数据是非常合适的,但是对于分布倾斜的数据或者在OLAP系统中是不建议使用的。

  [1] [2] 

ORACLE绑定变量BINDPEEKING

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage