表和索引统计信息自动采集的问题

Posted bisal

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表和索引统计信息自动采集的问题相关的知识,希望对你有一定的参考价值。

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

其中一个场景,就是当Oracle创建一张新表时,默认情况下,不会自动采集统计信息,19c的环境,做个测试,

例如测试表T,相同的统计信息都是空的,

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

因此当创建了一张新表,同时灌入了大量数据,在统计信息自动采集任务开始前就需要使用的情况下,建议人为采集统计信息,否则就可能导致因为统计信息不准,选错执行计划的场景。

而索引,情况不同,

创建索引的时候,会自动采集,

从他的创建语句就可以看出端倪,自带了"compute statistics"子句,他的意思是通过对数据对象的完全扫描来收集精确的统计数据,

但是存在一种特殊的场景,如果锁定某张表的统计信息,如下所示,执行了dbms_stats.lock_table_stats,表统计信息锁定可以从dba_tab_statistics的stattype_locked的字段进行判断,为空代表统计信息未锁定,ALL是锁定,

此时再创建索引,

可以看到,创建语句中并未带着"compute statistics",

索引的统计信息,自然是空的,

如果在创建时,显式带着compute statistics,会提示错误,说对象统计信息已经锁定了,

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

因此,当锁定了表的统计信息时,如果显式使用compute statistics创建索引,就会提示错误,因为索引统计信息同样被锁定了,开锁前,不能采集。如果不指定compute statistics,指定不采集索引统计信息,因此能创建。

以上现象不仅对普通表,对于分区表而言,同样适用,有兴趣的朋友,可以测下。

近期更新的文章:

小白学习MySQL - 变通创建索引的案例一则

ClickHouse安装和使用

ClickHouse介绍

最近碰到的一些问题

expdp导出表关联数据的功能

文章分类和索引:

《公众号800篇文章分类和索引

以上是关于表和索引统计信息自动采集的问题的主要内容,如果未能解决你的问题,请参考以下文章

截断表和更新统计信息

oracle中的统计信息问题

学习笔记-----统计信息

分析Hive表和分区的统计信息(Statistics)

使用analyze命令统计信息

查看表 和 索引的历史统计信息