运行dbms_stats.gather_table_stats时是否可以使用统计信息

时间:2018-11-29 07:06:24

标签: oracle oracle11g

我正在研究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-8PM,但是此表在12PM左右被完全刷新,导致统计信息过时。因此,我们临时收集了统计信息。

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

如果在重新生成统计信息的同时在此表上运行查询会怎样?

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

让我这样改一下这个问题:如果查询与dbms_stats.gather_table_stats并行运行,则可能发生以下情况:

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

  2. 没有可用的统计数据来制定适当的执行计划,并且基于成本的优化器在生成执行计划时会盲目执行

0 个答案:

没有答案