首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提高Oracle CBO对散列连接、按‘s和order by's的成本估算

如何提高Oracle CBO对散列连接、按‘s和order by's的成本估算
EN

Stack Overflow用户
提问于 2009-07-14 02:52:37
回答 1查看 3.5K关注 0票数 2

在我们有的服务器上,与实际成本相比,散列连接、按‘s分组和order’s的成本似乎太低了。也就是说,通常使用索引范围扫描的执行计划的性能优于前者,但在解释计划上,成本会更高。

一些进一步的说明:

  1. ,我已经将optimizer_index_cost_adj设置为20,但仍然不够好。我不想增加纯全表扫描的成本,实际上我不介意优化器降低成本。
  2. 我注意到pga_aggregate_target对CBO成本估计产生了影响,但我肯定不想降低这个参数,因为我们有大量的内存。
  3. 与在单个查询中使用优化器提示不同,我希望设置是全局的。

编辑1:我正在考虑尝试动态抽样,但我没有足够的亲密知识来预测这会如何影响整体性能,即执行计划可能改变的频率。我肯定更喜欢非常稳定的,事实上,对于一些最大的客户端,我们有一个锁定所有统计数据的策略(这将随着Oracle11gSQLPlainManagement而改变)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-14 09:18:15

通常情况下,使用索引范围扫描的执行计划比具有完整扫描+排序或散列连接的执行计划的性能要好,但是CBO选择了完整的扫描,这是因为优化者认为它会找到比实际得到的更多的匹配结果。

换句话说,如果优化器认为它将从表A获得100万行,从表B获得1000行,则很可能选择完全扫描+排序合并或散列连接;但是,如果当它实际运行查询时,它只从表A获得1行,则索引范围扫描很可能会更好。

首先,我将查看一些性能不佳的查询,分析谓词的选择性,确定优化器是否对每个表的行数进行了合理的估计。

编辑:您已经提到基数估计是不正确的。这是导致您的问题的根本原因;散列、连接和排序的成本计算可能很好。在某些情况下,优化器可能使用错误的估计,因为它不知道数据之间的关联程度。某些列上的直方图可能会有所帮助(如果您还没有得到它们),在某些情况下,您可以创建基于函数的索引,并收集隐藏列的统计信息,以便向优化器提供更好的数据。

最后,您在查询中指定各种表的基数的技巧很可能是获得满意性能所必需的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1123219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档