文章自动采集(如果显式使用compute创建索引统计信息就会提示错误!)
优采云 发布时间: 2022-02-04 08:25文章自动采集(如果显式使用compute创建索引统计信息就会提示错误!)
Oracle 的 CBO 是一个基于成本的优化器。计算过程中最重要的依据是统计信息,而统计信息的采集是有其逻辑的。
其中一种场景是Oracle新建表时,默认不会自动采集statistics,19c环境,做个测试,
比如测试表T,同样的统计都是空的,
当系统自动采集statistics,或者手动触发dbms_stats.gather_table_stats时,会写入表的统计信息。
因此,当新建表同时填充大量数据时,在自动采集任务启动前需要用到统计信息的情况下,建议手动采集统计信息,否则可能导致统计信息不,选择错误的场景执行计划。
而指数,情况不同,
创建索引时会自动采集,
从他的创建语句中可以看出端倪,其中附带了一个“计算统计”子句,意思是通过对数据对象的全扫描来采集准确的统计数据,
但是,有一种特殊情况。如果一个表的统计信息被锁定,如下图,执行dbms_stats.lock_table_stats,可以从dba_tab_statistics的stattype_locked字段判断表的统计信息锁。如果为空,则不锁定统计信息,锁定ALL,
此时创建索引,
如您所见,“计算统计”不收录在创建语句中,
索引的统计,自然是空的,
如果您在创建时显式引入计算统计信息,则会收到一条错误消息,指出对象统计信息已锁定。
从官方文档中对lock_table_stats的介绍可以知道,当表的统计信息被锁定时,所有依赖于该表的统计信息,包括表统计信息、列统计信息、直方图、索引统计信息都会被锁定。
因此,当表的统计信息被锁定时,如果显式使用计算统计信息创建索引,则会提示错误,因为索引统计信息也被锁定,解锁前不能采集。如果未指定计算统计信息,则不指定 采集 索引统计信息,因此可以创建它。
上述现象不仅适用于普通表,也适用于分区表。有兴趣的朋友可以测量一下。
最近更新的文章:
《小白学MySQL——另类索引创建案例》
《ClickHouse 安装与使用》
《ClickHouse 简介》
“最近的问题”
《expdp导出表关联数据的功能》
文章类别和索引:
《800公众号文章分类与索引》