zoukankan      html  css  js  c++  java
  • 开启和关闭绑定变量窥探

    绑定变量窥视cbo的一个附属功能,关闭他不会影响是用cbo还是rbo,就算关闭了绑定变量窥视,cbo还是会利用别的统计信息(num_distinct,density等)来评估cost和cardinality,只
     
    是无法使用直方图信息而已:
     
     
    SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
     FROM SYS.x$ksppi x, SYS.x$ksppcv y
     WHERE x.inst_id = USERENV ('Instance')
     AND y.inst_id = USERENV ('Instance')
     AND x.indx = y.indx
     AND x.ksppinm LIKE '%&par%';  2    3    4    5    6  
    Enter value for par: peek_user
    old   6:  AND x.ksppinm LIKE '%&par%'
    new   6:  AND x.ksppinm LIKE '%peek_user%'
     
    NAME                   VALUE DESCRIB
    ------------------------------ -------------------- ------------------------------
     
    _optim_peek_user_binds TRUE enable peeking of user binds
     
    
    此时绑定变量开启:
    
    
    
    create table test300 as select * from dba_objects;
    
    SQL> create table test300 as select * from dba_objects;
    
    表已创建。
    
    SQL> create index test300_idx1 on test300(owner);
    
    索引已创建。
    
    
    SQL> set linesize 200
    SQL> /
    
    OWNER											     COUNT(*)
    ------------------------------------------------------------------------------------------ ----------
    OWBSYS												    2
    APPQOSSYS											    5
    SCOTT												    6
    SI_INFORMTN_SCHEMA										    8
    BI												    8
    ORACLE_OCM											    8
    OUTLN												   10
    ORDPLUGINS											   10
    OWBSYS_AUDIT											   12
    TEST												   13
    FLOWS_FILES											   13
    
    OWNER											     COUNT(*)
    ------------------------------------------------------------------------------------------ ----------
    HR												   34
    PM												   44
    DBSNMP												   57
    IX												   58
    OE												  142
    ORDDATA 											  257
    SH												  309
    EXFSYS												  312
    WMSYS												  333
    CTXSYS												  389
    SYSTEM												  618
    
    OWNER											     COUNT(*)
    ------------------------------------------------------------------------------------------ ----------
    OLAPSYS 											  721
    XDB												 1170
    MDSYS												 2011
    ORDSYS												 2513
    APEX_030200											 2561
    SYSMAN												 3554
    PUBLIC												34001
    SYS												37789
    
    已选择30行。
    
    
    搜集统计信息:
    
     BEGIN
         DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SCOTT',
                                       tabname          => 'TEST',
                                       estimate_percent => 100,
                                       method_opt       => 'for all columns size skewonly',
                                       no_invalidate    => FALSE,
                                        degree           => 1,
                                       cascade          => TRUE);
       END;
    
    
    select a.column_name,
              b.num_rows,
               a.num_distinct Cardinality,
               round(a.num_distinct / b.num_rows * 100, 2) selectivity,
              a.histogram,
              a.num_buckets
          from dba_tab_col_statistics a, dba_tables b
         where a.owner = b.owner
           and a.table_name = b.table_name
          and a.owner = 'TEST'
          and a.table_name = 'TEST300';
          
          
          select owner, table_name name, object_type, stale_stats, last_analyzed
      from dba_tab_statistics
     where table_name in ('TEST300')
       and owner = 'TEST'
       and (stale_stats = 'YES' or last_analyzed is null);
    
    BEGIN
      DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'TEST',
                                    tabname          => 'TEST300',
                                    estimate_percent => 100,
                                    method_opt => 'for all columns size skewonly',
                                    no_invalidate    => FALSE,
                                    degree           => 1,
                                    cascade          => TRUE);
    END;
    
    
    
    
    
    
    SQL> alter system flush shared_pool;
     
    System altered.
     
     
    查看执行计划:
    
    
    ---高级执行计划:
    11G:
    alter session set statistics_level=all; ---再运行SQL
     
    
    select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    
     
    SQL> select * from test300 a where a.owner='TEST';
    
    
    SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	09j9dupsdynnf, child number 0
    -------------------------------------
    select * from test300 a where a.owner='TEST'
    
    Plan hash value: 638205358
    
    ---------------------------------------------------------------------------------------------------------------
    | Id  | Operation		    | Name	   | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
    ---------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT	    |		   |	  1 |	     |	   13 |00:00:00.23 |	   5 |	    3 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST300	   |	  1 |	  13 |	   13 |00:00:00.23 |	   5 |	    3 |
    |*  2 |   INDEX RANGE SCAN	    | TEST300_IDX1 |	  1 |	  13 |	   13 |00:00:00.01 |	   3 |	    0 |
    ---------------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("A"."OWNER"='TEST')
    
    
    已选择19行。
    
    
     select * from test300 a where a.owner='SYS';
    
    
    
    SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	d67v6znz35fs2, child number 0
    -------------------------------------
     select * from test300 a where a.owner='SYS'
    
    Plan hash value: 676079910
    
    ------------------------------------------------------------------------------------------------
    | Id  | Operation	  | Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |
    ------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |	    |	   1 |	      |  37789 |00:00:00.04 |	 3739 |   1242 |
    |*  1 |  TABLE ACCESS FULL| TEST300 |	   1 |	37789 |  37789 |00:00:00.04 |	 3739 |   1242 |
    ------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter("A"."OWNER"='SYS')
    
    
    已选择18行。
    
    
    
    
    使用绑定变量进行测试:
    alter session set statistics_level=all;
    SQL> set linesize 200
    SQL> set pagesize 200
    SQL>  variable n varchar2(10);
    SQL> exec :n :='TEST';
    
    PL/SQL 过程已成功完成。
    
    SQL> select * from test300 where owner = :n;
    
    已解释。
    
    已选择13行。
    
    SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	c5aj1qt7aqw6w, child number 1
    -------------------------------------
    select * from test300 where owner = :n
    
    Plan hash value: 638205358
    
    ------------------------------------------------------------------------------------------------------
    | Id  | Operation		    | Name	   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    ------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT	    |		   |	  1 |	     |	   13 |00:00:00.01 |	   5 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST300	   |	  1 |	  13 |	   13 |00:00:00.01 |	   5 |
    |*  2 |   INDEX RANGE SCAN	    | TEST300_IDX1 |	  1 |	  13 |	   13 |00:00:00.01 |	   3 |
    ------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("OWNER"=:N)
    
    
    已选择19行。
    
    
    
    
    
    SQL>  variable n varchar2(10);
    
    SQL>  exec :n :='SYS';
    
    PL/SQL 过程已成功完成。
    
    SQL>select * from test300 where owner = :n;
    
    已解释。
    SQL> 
    select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));SQL> 
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	c5aj1qt7aqw6w, child number 1
    -------------------------------------
    select * from test300 where owner = :n
    
    Plan hash value: 638205358
    
    ------------------------------------------------------------------------------------------------------
    | Id  | Operation		    | Name	   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    ------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT	    |		   |	  1 |	     |	37789 |00:00:00.07 |	6049 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST300	   |	  1 |	  13 |	37789 |00:00:00.07 |	6049 |
    |*  2 |   INDEX RANGE SCAN	    | TEST300_IDX1 |	  1 |	  13 |	37789 |00:00:00.03 |	2596 |
    ------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("OWNER"=:N)
    
    
    已选择19行。
    
    
    
    TEST												   13
    
    
    
    预估的记录13来自哪里呢 ?
    
    
    SQL>  select count(*) from test300 where owner='TEST';
    
      COUNT(*)
    ----------
    	13
    
    关闭绑定变量窥探:
    
    
     alter system  set "_optim_peek_user_binds"=FALSE;
    alter session set statistics_level=all;
    SQL> set linesize 200
    SQL> set pagesize 200
    SQL>  variable n varchar2(10);
    SQL> exec :n :='TEST';
    
    PL/SQL 过程已成功完成。
    
    SQL> select * from test300 where owner = :n;
    
    
    已选择13行。
    
    SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	c5aj1qt7aqw6w, child number 1
    -------------------------------------
    select * from test300 where owner = :n
    
    Plan hash value: 638205358
    
    ------------------------------------------------------------------------------------------------------
    | Id  | Operation		    | Name	   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    ------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT	    |		   |	  1 |	     |	   13 |00:00:00.01 |	   5 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST300	   |	  1 |	2899 |	   13 |00:00:00.01 |	   5 |
    |*  2 |   INDEX RANGE SCAN	    | TEST300_IDX1 |	  1 |	2899 |	   13 |00:00:00.01 |	   3 |
    ------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("OWNER"=:N)
    
    
    已选择19行。
    
    这个2899 怎么来的 
    
    SQL> select round(count(*)/count(distinct(owner))) from test300;
    
    ROUND(COUNT(*)/COUNT(DISTINCT(OWNER)))
    --------------------------------------
    				  2899
    
    
    
    exec :n :='SYS';
    
    
    
    SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
    
    PLAN_TABLE_OUTPUT
    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    SQL_ID	0ywg5mtbgkzkv, child number 0
    -------------------------------------
     select * from test300 where owner = :n
    
    Plan hash value: 638205358
    
    ------------------------------------------------------------------------------------------------------
    | Id  | Operation		    | Name	   | Starts | E-Rows | A-Rows |   A-Time   | Buffers |
    ------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT	    |		   |	  1 |	     |	37789 |00:00:00.07 |	6049 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST300	   |	  1 |	2899 |	37789 |00:00:00.07 |	6049 |
    |*  2 |   INDEX RANGE SCAN	    | TEST300_IDX1 |	  1 |	2899 |	37789 |00:00:00.03 |	2596 |
    ------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("OWNER"=:N)
    
    
    已选择19行。
    
    
  • 相关阅读:
    重新格式化部门表
    从不订购的客户
    回文数
    shell中的双括号表达式
    shell中的if语句
    shell
    view的生命周期
    shell中的数学运算
    shell中的expr命令
    shell中的退出状态码
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13348774.html
Copyright © 2011-2022 走看看