暂无图片
请教一个有挑战性的问题,同一个SQL,完全不同的执行计划
我来答
分享
palosky
2022-08-29
请教一个有挑战性的问题,同一个SQL,完全不同的执行计划

大佬们好,请教一个有挑战性的问题。同一个SQL,涉及到6-7张表。

测试环境为 oracle11.2.0.4,64位。

现在用dbsm_stats和analyze分别对这些表收集统计信息,然后执行相同SQL,发现执行计划完全不同。

在dbms_stats.gather_table_stats收集统计信息之后,SQL的执行计划为:


在analyze收集统计信息之后,SQL的执行计划为:


查看表和相关索引的统计信息SQL:

select table_name, num_rows, blocks, last_analyzed
from user_tab_statistics
where table_name = 'PO_ORDER_B';

select table_name, index_name, num_rows, distinct_keys, last_analyzed, leaf_blocks, clustering_factor
from user_indexes
where table_name = 'PO_ORDER_B'
and index_name = 'I_PU_21_B_DTORG'
order by 2;

select blevel, table_name, index_name, num_rows, distinct_keys, last_analyzed, leaf_blocks, clustering_factor
from user_ind_statistics
where index_name = 'I_PU_21_B_DTORG';
复制

通过以上SQL查看,发现dbms_stats和analyze两种方式收集的统计信息,基本接近,相差无几。


为什么同一个SQL,使用dbms_stats和analyze两种方式采集统计信息之后,执行计划相差如此之大呢?

请教大佬们,提供个分析排查思路。谢谢。

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
刘贵宾

dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划。


analyze收集后统计信息不准确,收集统计信息时采样比例过小等等。 Oracle优化器严重依赖于统计信息,如果统计信息有问题,则很容易导致SQL不能使用正确的执行计划。

暂无图片 评论
暂无图片 有用 0
打赏 1
暂无图片
palosky
上传附件:plan_dbms_stats.txt
暂无图片 评论
暂无图片 有用 0
打赏 0
palosky
上传附件:plan_analyze.txt
暂无图片 评论
暂无图片 有用 0
打赏 0
布衣
暂无图片

image.png
image.png

内容截取:
https://blog.csdn.net/cheng12050/article/details/8917919

希望对你有所帮助

暂无图片 评论
暂无图片 有用 1
打赏 0
张sir

你可以开一个10053,然后执行两个SQL,看看oracle是怎么选择的执行计划。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
问题信息
请登录之后查看
附件列表
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏