目前在我的数据库中,我的前任DB正在创建一个工作,每个周末都会收集数据库中所有表的列表,并且每个表单独执行以下两个命令:
ANALYZE TABLE xxTable_Namexx ESTIMATE STATISTICS FOR ALL INDEXED COLUMNS SIZE 75 SAMPLE 100 PERCENT;
EXEC dbms_stats.gather_table_stats(xxSchemaxx,xxTable_Namexx,cascade=>TRUE);
最近有人向我建议:
1。)ANALYZE表是一种收集统计信息的旧方法,优化器不再使用它了吗?这个命令的统计数据在整个数据库中是无用的,还是在某个地方使用?
是真的吗?2。)而不是完成所有这些,每天运行就足够了:
dbms_stats.gather_schema_stats(xxSchemaxx,cascade=>true);
如果未指定任何内容,那么size / sample%是什么?
3。)数据库中收集统计信息的一般做法/频率是什么? (数据每天都在更新,插入和删除)。我还是喜欢每周都这样做。
提前致谢。
答案 0 :(得分:0)
是的,现在很难使用ANALYZE:
要收集大多数统计信息,请使用DBMS_STATS包, 它允许您并行收集统计信息,收集全局信息 分区对象的统计信息,并微调统计信息 以其他方式收集。有关DBMS_STATS包的更多信息,请参阅Oracle Database PL/SQL Packages and Types Reference。
使用ANALYZE语句(而不是DBMS_STATS)进行统计 与基于成本的优化器无关的集合:
使用
VALIDATE
或LIST CHAINED ROWS
条款收集有关空闲列表块的信息
如果未指定任何内容,那么size / sample%是什么?
参数名为estimate_percent:
要估算的行的百分比(
NULL
表示计算):有效范围 是[0.000001,100]。使用常量DBMS_STATS.AUTO_SAMPLE_SIZE
来 让Oracle确定适当的样本大小以获得良好的统计数据。 这是默认值。可以使用更改默认值SET_DATABASE_PREFS
程序,SET_GLOBAL_PREFS
程序,SET_SCHEMA_PREFS
程序和SET_TABLE_PREFS
程序。
您可以按功能DBMS_STATS.get_param('ESTIMATE_PERCENT')
或DBMS_STATS.GET_PREFS('ESTIMATE_PERCENT')
默认情况下,Oracle会在安装时创建内部调度程序作业,该作业会在夜间自动收集统计信息。 (称为BSLN_MAINTAIN_STATS_JOB
)