在我们拥有的某些服务器上,哈希连接、分组依据和排序依据的成本与实际成本相比似乎太低了。 IE。通常,带有索引范围扫描的执行计划优于前者,但在解释计划中,成本显示得更高。
一些进一步的说明:
- 我已经将 optimizer_index_cost_adj 设置为 20,但仍然不够好。我不想增加纯全表扫描的成本,事实上我不介意优化器降低成本。
- 我注意到pga_aggregate_target会对 CBO 成本估算产生影响,但我绝对不想降低此参数,因为我们有足够的 RAM。
- 与在单个查询中使用优化器提示相反,我希望设置是全局的。
编辑 1:我正在考虑尝试动态采样,但我没有足够的深入知识来预测这将如何影响整体性能,即执行计划更改的频率。我肯定更喜欢非常稳定的东西,事实上,对于我们的一些最大的客户,我们有锁定所有统计数据的政策(这将随着 Oracle 11g SQL 计划管理而改变)。
最佳答案
通常,当使用索引范围扫描的执行计划优于使用完整扫描+排序或散列连接的执行计划时,但 CBO 会选择完整扫描,这是因为优化器相信它会找到比实际情况更多的匹配结果生活。
换句话来说,如果优化器认为要从A表中获取1M行,从B表中获取1000行,那么它很可能会选择全扫描+排序合并或散列连接;然而,如果当它实际运行查询时,它只从表 A 中获取 1 行,那么索引范围扫描可能会更好。
我首先查看一些性能不佳的查询并分析谓词的选择性,确定优化器是否对每个表的行数进行了合理的估计。
编辑: 您提到基数估计是不正确的。这是你问题的根本原因;哈希连接和排序的成本可能相当不错。在某些情况下,优化器可能会使用错误的估计,因为它不知道数据的相关程度。某些列上的直方图可能会有所帮助(如果您还没有获得它们),并且在某些情况下,您可以创建基于函数的索引并收集隐藏列的统计信息,以便为优化器提供更好的数据。
最终,您很可能需要在查询中指定各个表的基数的技巧才能获得令人满意的性能。
关于performance - 如何在没有提示的情况下增加哈希连接、分组依据和排序依据的 Oracle CBO 成本估算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1123219/