【问题标题】:Oracle: Analyze table vs Gather_Table_Stats vs Gather_Schema_StatsOracle:分析表 vs Gather_Table_Stats vs Gather_Schema_Stats
【发布时间】:2018-10-23 19:07:28
【问题描述】:

目前在我的数据库中,我从事数据库工作的前任创建了一项工作,该工作在每个周末收集数据库中所有表的列表,并为每个表分别按以下顺序执行以下两个命令:

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.) 在数据库中收集统计数据的一般做法/频率是什么。 (数据每天都在更新、插入、删除)。我还是更喜欢每个周末都这样做。

提前致谢。

【问题讨论】:

标签: oracle oracle11g database-administration


【解决方案1】:

是的,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

【讨论】:

  • Use the ANALYZE statement (rather than DBMS_STATS) for statistics collection not related to the cost-based optimizer: 所以收集一些统计数据还有用吗??这些统计数据是做什么用的?感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 2012-02-12
相关资源
最近更新 更多