前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >表和索引统计信息自动采集的问题

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

作者头像
bisal
发布于 2021-12-30 09:43:45
发布于 2021-12-30 09:43:45
9140
举报

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,指定不采集索引统计信息,因此能创建。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/12/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档