我正在研究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并行运行,则可能发生以下情况:
oracle将使用先前/过时的统计信息来确定执行计划吗?在我看来,这是可以接受的,因为在大多数情况下,数据的统计分布相对恒定,因此从oracle的角度来看,统计数据可能是陈旧的,但在实践中仍然足够好
没有可用的统计数据来制定适当的执行计划,并且基于成本的优化器在生成执行计划时会盲目执行