文章自动采集(如果显式使用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公众号文章分类与索引》

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线