Oracle: 分析表 vs 收集表统计信息 vs 收集模式统计信息

3

目前在我的数据库中,我的前任在工作时创建了一个任务,每个周末都会收集数据库中所有表格的列表,并为每个表格依次执行以下两个命令:

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);

如果没有指定大小/样本百分比,那么是多少?

3.) 在数据库中收集统计信息的一般做法/频率是什么?(数据每天都在更新、插入、删除)。我仍然更喜欢每个周末执行。

提前感谢。


1
请返回已翻译的文本:https://docs.oracle.com/database/121/ADMIN/general.htm#ADMIN11525https://docs.oracle.com/database/121/ARPLS/d_stats.htm#ARPLS059 - user330315
@a_horse_with_no_name 谢谢你提供的链接。它非常有帮助和启发性!! - pOrinG
1个回答

2

是的,ANALYZE现在很少使用:

对于大多数统计信息的收集,请使用DBMS_STATS包, 它允许您并行收集统计信息,为分区对象收集全局 统计信息,并以其他方式微调您的统计信息 收集。有关DBMS_STATS包的更多信息,请参见Oracle Database PL/SQL Packages and Types Reference

对于与基于成本的优化器无关的统计信息收集,请使用ANALYZE语句(而不是DBMS_STATS):

  • 使用VALIDATELIST CHAINED ROWS子句

  • 收集有关空闲列表块的信息

如果未指定大小/样本%,它是多少??

参数称为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


使用ANALYZE语句(而不是DBMS_STATS)进行与基于成本的优化器无关的统计信息收集:因此,收集一些统计信息仍然很有用?这些统计信息用于什么?感谢您的回复。 - pOrinG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接