表和索引统计信息自动采集的问题
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,指定不采集索引统计信息,因此能创建。
以上现象不仅对普通表,对于分区表而言,同样适用,有兴趣的朋友,可以测下。
近期更新的文章:
文章分类和索引:
以上是关于表和索引统计信息自动采集的问题的主要内容,如果未能解决你的问题,请参考以下文章