自动采集(如果显式使用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,这样就可以创建了。
上述现象不仅适用于普通表,也适用于分区表。有兴趣的朋友可以测试一下。