首页 > 解决方案 > 运行 dbms_stats.gather_table_stats 时统计信息是否可用

问题描述

我正在研究 oracle11g。

有一个外部进程在给定表上运行 dbms_stats.gather_table_stats。更具体地说,它运行以下代码:

dbms_stats.gather_table_stats('STAGING','NEW_TRANSACTIONS',
      estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, 
      cascade=>true, method_opt=> 'FOR ALL INDEXED COLUMNS SIZE 1', 
      NO_INVALIDATE=>FALSE,DEGREE=>8); 

由于维护窗口在下午 6 点到 8 点,因此自动统计信息收集在该表上效果不佳,但该表在下午 12 点左右完全刷新,导致统计信息过时。因此,我们专门收集统计数据。

假设收集统计信息需要 60 秒。

如果在重新生成统计信息时对该表运行查询会发生什么?

以前的(陈旧的)统计信息在生成新的统计信息之前是否可用?还是 oracle 在启动 dbms_stats.gather_table_stats 时完全删除统计信息?

让我用这种方式重新表述这个问题:如果查询与 dbms_stats.gather_table_stats 并行运行,那么很可能会发生这种情况:

  1. oracle 会使用先前/陈旧的统计信息来确定执行计划吗?从我的角度来看,这是可以接受的,因为数据的统计分布在大多数日子里都是相对恒定的,所以从 oracle 的角度来看,统计数据可能是陈旧的,但在实践中仍然足够好

  2. 没有可用的统计信息来设置正确的执行计划,基于成本的优化器在生成执行计划时会失明

标签: oracleoracle11g

解决方案


推荐阅读