统计信息自动收集时间窗口导致分区表执行计划错误

这次上海用户报告一个奇怪的问题,本来运行正常的程序,变得非常慢,让我帮忙查找一下原因。 很快定位到其中是数据库查询语句慢导致的。获取该语句的执行计划

很奇怪明明是应该对分区全表扫描的,怎么变成了对索引范围扫描, 查看表和索引的统计信息 查看该分区的行数
奇怪,怎么统计信息是错的,执行计划错误出现的原因找到了。但是为什么会这样呢。原来我将该表的分区时间设为每天的0点,有时用户会将第二天的数据错误的发过来,导致提前创建了分区,结果晚上10点到第二天凌晨2点维护窗口启动时,自动收集统计信息任务启动,收集了统计信息,但是对该分区,这些信息是错误的,所以oracle生成错误的执行计划。知道原因就好改了,将分区改为从中午12点开始。修改好后,收集统计信息,执行计划正常,用户程序恢复正常。以后也没有报这个错误了。

这次执行计划的原因很快被找到,但是为什么会这样花了点时间排查,算是一次难得的经历。

针对Oracle分区表收集统计信息可以通过以下步骤完成: 1. 确定需要收集统计信息分区表。 2. 使用DBMS_STATS包中的GATHER_TABLE_STATS过程收集表的统计信息。例如: ``` EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'schema_name',tabname=>'table_name',partname=>'partition_name',cascade=>TRUE,estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE); ``` 其中,ownname代表分区表所在的schema名称,tabname代表分区表名称,partname代表分区名称,cascade参数指定收集分区表的所有分区的统计信息,estimate_percent参数指定使用自动样本大小。 3. 对于大型分区表,可以考虑使用INCREMENTAL方法收集统计信息,以便节省收集统计信息时间和资源。例如: ``` EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>'schema_name',tabname=>'table_name',partname=>'partition_name',cascade=>TRUE,estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE,method_opt=>'FOR ALL COLUMNS SIZE AUTO INCREMENTAL ON PARTITION(partition_name)'); ``` 其中,method_opt参数指定了使用INCREMENTAL方法收集统计信息,并且只对指定的分区进行增量收集。 4. 在收集分区表统计信息后,可以使用DBMS_STATS.PURGE_TABLE_STATS过程清除过期的统计信息。例如: ``` EXEC DBMS_STATS.PURGE_TABLE_STATS(ownname=>'schema_name',tabname=>'table_name',partname=>'partition_name',cascade=>TRUE); ``` 其中,cascade参数指定清除分区表的所有分区的统计信息。 以上就是收集Oracle分区表统计信息的基本步骤。需要注意的是,统计信息收集频率应该根据分区表数据的变化情况来确定,以便保证查询优化器的准确性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值