这里的统计信息指的是优化器(OPTIMIZER)统计信息,当Oracle数据库工作在CBO(COST BASED OPTIMIZER)模式下,优化器根据数据字典中记录的对象统计信息,评估SQL语句不同执行计划的成本,从而找到最优或者是相对最优的执行计划。从这一点来看统计信息的准确性就显得非常重要了,尤其是对于oracle10g以后的数据库,因为oracle10g以后,Oracle默认的优化器模式是all_rows,也就是基于成本的优化器。
优化器工作原理图:
2.用户手动收集统计信息
手动收集统计信息适合于对于新建表、刚做完数据装载的表和表里数据变化比较频繁的
表(一天超过10%),如果仅仅是为了收集统计信息,建议使用dbms_stats包来实现
a.使用DBMS_STATS程序包
对于新建的表,默认是没有统计信息的
SQL> create table e as select empno,ename,sal from emp where rownum select table_name,num_rows,
2 blocks,to_char(last_analyzed,'yyyy-mm-ddhh24:mi:ss')
3 from user_tables
4 where table_name='E';
不管使用上面语句当中的哪一个,都会看到准确的统计信息
SQL> select table_name,num_rows,blocks,to_char(last_analyzed,'yyyy-mm-dd hh24:mi:ss')
2 from user_tables
3 where table_name='E';
TABLE_NAME NUM_ROWS BLOCKS TO_CHAR(LAST_ANALYZ
------------------------------ ---------- ---------- -------------------
E 9 8 2012-10-31 11:13:48
3.动态采样
对于没有统计信息的表,oracle为了能够得到相对准确的执行计划,会在执行SQL语句之前对语句设计
到的表做动态采样
从10g开始,oracle默认把optimizer_dynamic_sampling的等级设为2,那就会出现如果对象没有统计信
息,oracle就会在每次查询的时候进行采样,所以oracle看起来会相当的智能。
SQL> show parameter dyna
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_dynamic_sampling integer 2