Oracle:导入表的统计信息后,优化程序使用动态采样

时间:2016-09-29 07:22:02

标签: oracle optimization rdbms

以下是我为scott.emp表所做的步骤。

  1. select * from emp where empno > 7503

  2. select * from table(dbms_xplan.display_cursor);

  3.    [..]
       Note
       -----
          - dynamic statistics used: dynamic sampling (level=2)
    
    1. exec DBMS_STATS.GATHER_TABLE_STATS ('scott','EMP');

    2. select * from emp where empno > 7503.

    3. select * from table(dbms_xplan.display_cursor);

      -- No Dynamic sampling used --
      
    4. 导出表统计信息。

    5. 清理实例并启动新实例。
    6. 导入表统计信息。
    7. select NUM_ROWS,LAST_ANALYZED,GLOBAL_STATS,USER_STATS from USER_TAB_STATISTICS where table_name ='EMP';

       14 28-SEP-16 YES NO
      
    8. select * from emp where empno > 7503.

    9. select * from table(dbms_xplan.display_cursor);
    10.  Note
       -----
         - dynamic statistics used: dynamic sampling (level=2)**
      

      为什么即使表有统计数据,也会使用动态采样?导入统计数据后是否需要触发任何内容? 为什么在第一次收集统计数据后,优化程序没有使用动态采样?(步骤5)?

1 个答案:

答案 0 :(得分:0)

有原因。在步骤8中,我只导入表统计信息。如果我们导入db stats,system,dictionary stats,那么Optimizer将不会进行动态采样。

优化器规则:如果优化器没有/足够的统计数据,那么它将尝试进行采样。

因此,为了模拟执行计划,需要导入所有统计数据。