各位读者大家好,上一章节介绍了常见索引和执行计划。在介绍执行计划的时候有这样一段代码我们来详细讲解介绍一下:
begin
dbms_stats.gather_table_stats(
ownname => user,
tabname => 'employees',
estimate_percent => 100,
cascade => true,
method_opt => 'for all columns size auto'
);
end;
上面这段sql的作用是数据库收集表employees的统计信息。具体包括表数据分布特征,含表数据的行数、块数、平均行长等信息;cascade => true参数会收集表所有的索引的统计信息(例如索引深度、聚合因子等);method_opt => 'for all columns size auto'参数会分析列数据分布,记录所有列的数据分布特征;estimate_percent => 100表示对表数据进行100%采样。保证统计信息的准确性。
当我们要测试执行计划的时候,为了保证执行计划的准确性就需要让扫描优化器获取到表数据的统计信息是最新的,否则执行计划就会滞后,进而有可能带给我们对sql执行的误判。例如当我们往表里面新增10万条数据后,此时数据库对该表保存的统计信息未必就一定是10万数据的统计信息。oracle数据库自动收集统计信息的频率有其默认的时间窗口和触发条件(一般是当表数据修改量超过10%时触发收集)。当我们执行上面那段sql就是手动触发收集最新的统计信息。我们可以通过下面的sql来查看统计信息更新情况:
-- 查看表统计信息
select last_analyzed, num_rows, blocks
from user_tables
where table_name = 'EMPLOYEES';
-- 查看列统计信息
select column_name, num_distinct, histogram
from user_tab_columns
where table_name = 'EMPLOYEES';
-- 查看索引统计
select index_name, last_analyzed, clustering_factor
from user_indexes
where table_name = 'EMPLOYEES';
例如当我们执行上面三条sql后返回结果分别如下图:


最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



