自动采集(如果显式使用compute创建索引统计信息就会提示错误!)

优采云 发布时间: 2022-01-05 21:08

  自动采集(如果显式使用compute创建索引统计信息就会提示错误!)

  Oracle 的 CBO 是一个基于成本的优化器。计算过程中最重要的依据是统计信息,在统计信息的采集中有他的逻辑。

  其中一种场景是Oracle在新建表时,默认情况下不会自动采集统计。在19c环境下,做一个测试。

  比如测试表T,同样的统计信息为空,

  当系统自动采集统计信息,或人为触发dbms_stats.gather_table_stats时,会写入该表的统计信息。

  所以在新建表同时注入大量数据时,如果需要在自动采集的任务开始前使用统计信息,建议使用采集@ > 统计信息,否则可能导致统计信息。不,选择错误的场景来执行计划。

  而指数,情况就不一样了,

  创建索引时,会自动采集

  从他的创建语句中可以看出端倪,该语句带有“计算统计”子句,意思是通过对数据对象的全面扫描来采集准确的统计信息。

  但是,有一个特殊的场景。如果锁定某个表的统计信息,如下图,执行dbms_stats.lock_table_stats,可以通过dba_tab_statistics的stattype_locked字段判断表统计锁定。如果为空,则统计信息不加锁,ALL被加锁,

  这时候创建一个索引,

  如您所见,“计算统计信息”未收录在创建语句中。

  指标的统计信息自然是空的,

  如果在创建时显式带入计算统计信息,则会显示错误,表示对象统计信息已被锁定。

  从官方文档中对lock_table_stats的介绍可以知道,当表的统计信息被锁定时,所有依赖于该表的统计信息,包括表统计、列统计、直方图、索引统计,都会被锁定。

  因此,当表的统计信息被锁定时,如果明确使用compute statistics创建索引,会提示错误,因为索引统计信息也被锁定。解锁前不能采集。如果不指定compute statistics,就不要指定采集 index statistics,这样就可以创建了。

  上述现象不仅适用于普通表,也适用于分区表。有兴趣的朋友可以测试一下。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线