要对数据库对象生成统计信息,可以有以下方法:
完全统计法:analyze table table_name compute statistics;
抽样估计法:analyze table table_name estimate statistics sample 30 percent;
对表使用抽样估计法要比完全统计法的生成统计速度要快,但是统计数据可能不够精确。在开发过程中,我们可能要涉及很多的表的查询,而我们在使用CBO的时候就需要经常对这些表执行分析统计,得到CBO所需要的统计数据。
下面对analyze进行使用分析
analyze table t1 compute statistics for table;
analyze table t2 compute statistics for all columns;
analyze table t3 compute statistics for all indexed columns;
analyze table t4 compute statistics;
--现在再来查看表和索引的统计信息
select table_name,num_rows,blocks,empty_blocks,initial_extent from user_tables where table_name in ('T1','T2','T3','T4');
-索引的统计信息
select table_name,index_name,blevel,leaf_blocks,distinct_keys,
avg_leaf_blocks_per_key avg_leaf_blocks,avg_data_blocks_per_key avg_data_blocks,clustering_factor,num_rows
from user_indexes where table_name in ('T1','T2','T3','T4');
小贴士:
1、使用analyze时不一定是最好的方法,有可能影响CBO,所以在生产库不要顺便使用,应在测试库使用analyze后再分析生产库
2、效率低的sql语句,还可以在前面加上select /*+ rule */用RBO的优化方式测试,当然最好使用CBO,这时可在CBO的基础上指定Hints
3、如果使用analyze分析错误,恢复到分析前的状态,请使用
analyze table table_name delete statistics
dbms_stats.delete_table_stats(owner_name,table_name);
rbo和cbo只是oracle寻找最佳执行计划的不同方式而已.
rbo 根据一定的规则来选择他认为最快的执行计划,
cbo 根据系统提供的统计信息, 表的记录数据,表的分布情况,索引的键值多少和分布情况,字段的唯一性和分布情况,再加上一些系统的参数,使用一套算法来计算各种执行路径的成本.选择他认为成本最低的路径.(10g建议cbo,最好使用cbo)
choose 提示的应用
只要查询的表中有一个表有统计数据,系统就会使用cbo否则使用rbo