dbms_stats.gather_schema_stats可以使用options => 'GATHER STALE'来只分析有过时的统计信息的表。那么Oracle是如何知道表的统计信息是过时(STALE)的呢?这就是本文探讨的问题。

首先Oracle是根据dba_tab_statistics的stale_stats字段来找出统计信息STALE的表,默认情况下STALE的定义是自从上次分析之后变动超过10%的表。那么Oracle是如何知道哪些表有多少变动呢?

答案就是在10g之前,通过alter table monitoring来制定,在10g之后,只要开启了AWR,也就是statistics_level=typical或all之后,所有表都自动被monitoring。这些收集的信息就放在dba_tab_modifications视图里。所以,dba_tab_statistics的stale_stats字段是通过分析dba_tab_modifications来得到。

但是最近我们遇到的一个问题是,dba_tab_statistics.stale_stats显示没有任何表有stale stats,但是通过dbms_stats.gather_schema_stats的options => 'GATHER STALE'进行收集,却有不少表被分析。

原来问题出在dba_tab_modifications视图的刷新频率不是实时上,在文档里可以看到:

“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 DIMS_STATS PL/SQL package to populate this view with the latest information. ”

而dbms_stats.gather_schema_stats的options => 'GATHER STALE'执行之前相当于会自动的FLUSH_DATABASE_MONITORING_INFO一次然后再开始分析。

所以解决方法是在脚本里添加dbms_stats.FLUSH_DATABASE_MONITORING_INFO();,再查看dba_tab_statistics.stale_stats。

综上,依赖关系如下:

dbms_stats.gather_schema_stats's options 'GATHER STALE'

=======>dba_tab_statistics.stale_stats = 'YES'

=======>   dba_tab_modifications has 10% change

=======>   9i(alter table monitoring),>=10G(AWR enabled)

=======>   dbms_stats.FLUSH_DATABASE_MONITORING_INFO(); can help get the most current info, otherwize not accurate.

具体实验如下:

1. user_tab_statistics.stale_stats is based on user_tab_modificationsSQL> insert into AAA select * from AAA;

65536 rows created.

SQL> commit;

Commit complete.

SQL> select TABLE_NAME,INSERTS,UPDATES,DELETES from user_tab_modifications;

no rows selected

SQL> select TABLE_NAME from user_tab_statistics where stale_stats = 'YES';

no rows selected

SQL> exec dbms_stats.FLUSH_DATABASE_MONITORING_INFO();

PL/SQL procedure successfully completed.

SQL> select TABLE_NAME,INSERTS,UPDATES,DELETES from user_tab_modifications;

TABLE_NAME                        INSERTS    UPDATES    DELETES

------------------------------ ---------- ---------- ----------

AAA                                 65536          0          0

SQL> select TABLE_NAME from user_tab_statistics where stale_stats = 'YES';

TABLE_NAME

------------------------------

AAA

2.gather_schema_stats will analyze the actuall 'STALE' tables even if they didn't show up in the user_tab_statistics.

SQL> insert into AAA select * from AAA;

262144 rows created.

SQL> commit;

Commit complete.

SQL> select TABLE_NAME,INSERTS,UPDATES,DELETES from user_tab_modifications;

no rows selected

SQL> select TABLE_NAME from user_tab_statistics where stale_stats = 'YES';

no rows selected

SQL> select to_char(LAST_ANALYZED,'yyyymmdd hh24:mi:ss') from user_Tables where table_name='AAA';

TO_CHAR(LAST_ANAL

-----------------

20100921 20:29:12

SQL> BEGIN

2  dbms_stats.gather_schema_stats(ownname => 'HAOZHU',options => 'GATHER STALE',estimate_percent => 100,method_opt=> 'for all columns size 1',  cascade=>true,no_invalidate => false, degree=>1);

END;  3

4  /

PL/SQL procedure successfully completed.

SQL> select to_char(LAST_ANALYZED,'yyyymmdd hh24:mi:ss') from user_Tables where table_name='AAA';

TO_CHAR(LAST_ANAL

-----------------

20100921 20:30:43

oracle stalestats_dbms_stats.gather_schema_stats的GATHER STALE选项相关推荐

  1. 怎么查看Oracle安装包版本,如何查看Oracle版本及安装了哪些选项

    如何查看Oracle版本及安装了哪些选项 (2006-10-26 15:59:28) 系统环境: 1.操作系统:Windows 2000 2.数据库: Oracle 8i R2 (8.1.6) for ...

  2. oracle数据库没有选项,创建oracle数据库时,出现ORA-00922: 选项缺失或无效

    sdd53HOME 新建oracle数据库时遇到ORA-00922: 选项缺失或无效的问题,如图: 原因:一般是语句的语法有问题.比如命名不对,关键字写错等等.对于非标准的命名,一般采用双引号来创建. ...

  3. oracle 导出写入文件失败怎么办,编辑dmp文件解决导入导出问题(oracle 922错误 ,缺少或无效选项)...

    导入导出的dmp文件时出现如下错误 经由常规路径导出由EXPORT:V09.02.00创建的文件 已经完成ZHS16GBK字符集和AL16UTF16 NCHAR 字符集中的导入 IMP-00017: ...

  4. Oracle EBS Concurrent Request:Gather Schema Statistics

    Oracle EBS 的Concurrent Request"Gather Schema Statistics"是一个和性能相关的Concurrent Program,它会对表,列 ...

  5. 简单 描述oracle 存储结构,下面的各选项中哪一个正确描述了

    [判断题]酰基载体蛋白 (ACP) 是饱和脂肪酸碳链延长途径中二碳单位的活化供体. [单选题]α k 是钢材的 指标. [单选题]=( ) [单选题]长期生产中可以改变的变量有 [单选题]听音频,选择 ...

  6. oracle remap schema,impdp的remap_schema选项的另一个schema是否要重建

    刚才和同学聊天,说到数据泵IMPDP的remap_schema会不会自动创建用户.做了一个实验. remap_schema后面的用户需要建立好,才行. [oracle@rh5 ~]$ impdp sy ...

  7. oracle外键约束的各种选项,聊聊Oracle外键约束的几个操作选项

    三.On delete cascade 对于应用开发人员而言,严格外键约束关系是比较麻烦的.如果直接操作数据库记录,就意味着需要手工处理主子表关系,处理删除顺序问题.On delete cascade ...

  8. ORACLE 中dbms_stats的使用

    dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划. execdbms_stats.gather_schema_stats( ...

  9. oracle dbms是什么意思,oracle的dbms_stats包详细解说

    dbms_stats包问世以后,Oracle专家可通过一种简单的方式来为CBO收集统计数据.目前,已经不再推荐你使用老式的分析表和dbms_utility方法来生成CBO统计数据.那些古老的方式甚至有 ...

最新文章

  1. 在微服务架构下基于 Prometheus 构建一体化监控平台的最佳实践
  2. AspectJ对AOP的实现
  3. js实现购物车数量的增加与减少,js实现购物车数量的自增与自减
  4. Stanford UFLDL教程 稀疏自编码器符号一览表
  5. WHEN OVERSEAS
  6. 资源包技巧和最佳实践
  7. 新疆计算机二级慨库,2020新疆维吾尔自治区计算机二级易考套餐:二级MS Office高级应用全程班(网课+题库+教材)...
  8. 数据库杂谈(九)——事务管理
  9. Xml文档添加节点和属性
  10. 微擎在线goto解密系统
  11. Mybatis的Mapper代理
  12. ASP.NET2.0小技巧--内部控件权限的实现
  13. 如何在Python中串联两个列表?
  14. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_06-vuejs研究-vuejs基础-v-on指令...
  15. Python 中国象棋源码 V1
  16. OK6410A 开发板 (三) 4 u-boot-2021.01 boot 解析 SPL 编译链接部分
  17. CTF--攻防世界crypto新手训练1-6
  18. mybatis if-else(chose when otherwise )
  19. Yii2 event-如何使用事件
  20. 2023/2/13 ubuntu18.04版本无线与有线网络网络配适流程

热门文章

  1. GPU 与 CPU 的数据交互
  2. c4d python sdk,使用Python SDK开发语录类技能模板
  3. 如何成为一名全职创作者——程序员篇
  4. 细说javaScript入门学习
  5. 【Day7.2】大坂山八月飞雪
  6. 蓝牙运动耳机推荐,目前最好用的运动耳机分享
  7. mysql,oracle数据库优化之索引
  8. 数学公式输入神器推荐—Mathpix Snip
  9. 如何在微信小程序中使用wxParser(富文本编辑器)
  10. appinventor 2热成像 热力图组件定制extension插件,安卓APP开发