Oracle中如何找出统计信息过期的表

0    198    3

Tags:

👉 本文共约4978个字,系统预计阅读时间或需19分钟。

在ORACLE数据库当中,我们如何判断当前对象的统计信息是否过期/过时(Stale)的呢?从哪些维度去判断呢?我们有那些方法呢?下面介绍ORACLE数据库中一些找出过期统计信息的方法,主要有下面几种方法:

1:DBA_TAB_STATISTICS告诉你统计信息过期

主要通过DBA_STATISTICS中的STALE_STATS列来判断统计信息是否过期,当STALE_STATS字段值为YES时,表示统计信息过期了,NO表示统计信息未过期。这个是最简单的方法。那么ORACLE是如何判断统计信息过期的呢?其实数据库判断统计信息是否过期(stale)的依据是当前表的DML操作的记录数是否超过表数据量的10%,如果超过10%这个阈值,统计信息就被认为是过期了。Oracle就认为这些表应该需要重新收集一次统计信息了。

下面是官方文档的部分介绍:

stale_stats says whether the stats are considered fresh or stale, or if the stats will be gathered automatically next time or not. The default settings is 10 percent. If you gather table statistics and then insert/update/delete less than 10 percent of rows the statistics is considered fresh. When you reach 10 percent of modified rows they become stale.

查看统计信息过期的脚本

2:通过DBA_TABLES的LAST_ANALYZED列判断

这里主要是通过上一次的收集统计信息的时间来判断。其实根据收集统计信息的时间来判断统计信息是否过时,其实有一定的局限性和不合理性。时间维度来判断太过粗糙。例如对于维表,或者一些数据长期没有DML操作的表来说,以LAST_ANALYZED来判断的话,就有失公允。所以这种方法仅供参考,在有些场合完全是无效的。也就是说从统计信息采集的时间维度来判断,根本是不可靠的,仅供参考。

下面例子,统计信息超过7天没有更新的表。

3:使用DBMS_STATS.GATHER_SCHEMA_STATS找出统计信息过期的表

使用dbms_stats.gather_schema_stats包找出统计信息过期的对象,如下所示:

找出某个SCHEMA下统计信息过期的对象

找出整个数据库中统计信息过期的对象

找出没有统计信息的表

参考资料:How to List the Objects with Stale Statistics Using dbms_stats.gather_schema_stats options=>'LIST STALE' (Doc ID 457666.1)[1]

4:手工验证统计信息是否过旧

通过系统视图DBA_TAB_MODIFICATIONS来判断统计新是否过期。DBA_TAB_MODIFICATIONS使用来记录表的DML操作,依靠里面的信息确定统计信息是否陈旧。确定表是否需要统计分析的依据。系统后台调用DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO更新,当然也可以手工调用更新信息。它的原理也是数据变化量是否超过10%。

DBA_TAB_MODIFICATIONS describes modifications to all tables in the database that have been modified since the last time statistics were gathered on the tables. Its columns are the same as those in "ALL_TAB_MODIFICATIONS".

This view is populated only for tables with the MONITORING attribute. It is intended for statistics collection over a long period of time. For performance reasons, the Oracle Database does not populate this view immediately when the actual modifications occur. Run the FLUSH_DATABASE_MONITORING_INFO procedure in the DBMS_STATS PL/SQL package to populate this view with the latest information. The ANALYZE_ANY system privilege is required to run this procedure.

当然你还可以通过其它方式手工验证统计信息是否过旧,例如检查表的行记录信息

检查表的行记录情况

检查DBA_TAB_COL_STATISTICS中表的列的NUM_DISTINCT,LOW_VALUE,HIGH_VALUE,NUM_NULLS值,然后将其与实际值对比,从而判断统计信息 是否过期,不过这种方法虽然最准确,但是比较繁琐耗时,而且有些表的统计信息的采样比例可能不是100%,所以实际操作实施起来也比较麻烦。

其它有关统计信息的内容

Oracle的统计信息包括哪几种类型?

在Oracle中,自动收集统计信息的机制有哪些?10g和11g在自动收集统计信息方面有哪些区别?

在Oracle中,怎样收集表的统计信息?怎样收集分区表的统计信息?

在Oracle中,什么是动态采样(Dynamic Sampling)?

在Oracle中,如何锁住统计信息?

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

在Oracle中,什么是待定的统计信息(Pending Statistic)?

在Oracle中,什么是直方图(Histogram)?直方图的使用场合有哪些?

在Oracle中,直方图分为哪几类?

在Oracle中,如何收集直方图信息?在收集直方图时有哪些注意事项?

在Oracle中,直方图使用示例。

在Oracle中,文本型字段直方图示例2个。

在Oracle中,什么是多列统计信息(Extended Statistics)?

在Oracle中,基表COL_USAGE$的作用是什么?

在Oracle中,新建索引后统计信息是否自动收集?

在Oracle中,什么是基数反馈(Cardinality Feedback)?

在Oracle中,如何查询表和索引的历史统计信息?

在Oracle中,如何并发地收集统计信息?

在Oracle中,当收集表的统计信息时应该注意哪些问题?

在Oracle中,什么是基数(Cardinality)和可选择率(Selectivity)?

在Oracle中,使用SPLIT来拆分某个分区的时候,其拆分出来的新分区的统计信息行数是多少?

在Oracle中,当自动收集任务运行时,哪些对象会被收集?

在Oracle中,分区表统计信息的更新机制是怎样的?

在Oracle中,如何查询表的DML操作数据变化量?

在Oracle中,对表执行TRUNCATE操作会将表的统计信息也清除掉吗?

参考

[1]Doc ID 457666.1: https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=261334488623108&id=457666.1&_afrWindowMode=0&_adf.ctrl-state=ia86l9cqo_80

https://mp.weixin.qq.com/s/n5I0_CvPkOsi-QAgMj_8DA

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部