Performance 如何增加散列联接的Oracle CBO成本估算,分组依据';由';没有暗示

Performance 如何增加散列联接的Oracle CBO成本估算,分组依据';由';没有暗示,performance,oracle,oracle10g,optimization,cbo,Performance,Oracle,Oracle10g,Optimization,Cbo,似乎在我们拥有的一些服务器上,哈希连接、groupby和orderby的成本与实际成本相比太低了。即,通常使用索引范围扫描的执行计划优于前者,但在解释计划上,成本更高 一些进一步的说明: 我已经将optimizer_index_cost_adj设置为20,但仍然不够好。我不想增加纯全表扫描的成本,事实上,我不介意优化器降低成本 我注意到pga_aggregate_target会对CBO成本估算产生影响,但我绝对不想降低此参数,因为我们有大量的RAM 与在单个查询中使用优化器提示不同,我希望设置是

似乎在我们拥有的一些服务器上,哈希连接、groupby和orderby的成本与实际成本相比太低了。即,通常使用索引范围扫描的执行计划优于前者,但在解释计划上,成本更高

一些进一步的说明:

  • 我已经将optimizer_index_cost_adj设置为20,但仍然不够好。我不想增加纯全表扫描的成本,事实上,我不介意优化器降低成本
  • 我注意到pga_aggregate_target会对CBO成本估算产生影响,但我绝对不想降低此参数,因为我们有大量的RAM
  • 与在单个查询中使用优化器提示不同,我希望设置是全局的


  • 编辑1:我正在考虑尝试使用动态采样,但我没有足够的专业知识来预测这会如何影响总体性能,即执行计划的更改频率。我当然更喜欢非常稳定的,事实上,对于我们一些最大的客户,我们有一个锁定所有统计数据的策略(这将随Oracle 11g SQL计划管理而改变)。

    通常,当索引范围扫描的执行计划优于完全扫描+排序或哈希连接的执行计划时,但是国会预算办公室选择了完整的扫描,因为乐观主义者相信他们会找到比实际生活中更多的匹配结果

    换句话说,如果乐观主义者认为它将从表A中获得100万行,从表B中获得1000行,那么它很可能会选择完全扫描+排序合并或哈希连接;但是,如果在实际运行查询时,它只从表A中获取1行,那么索引范围扫描可能会更好

    我首先查看一些性能较差的查询,并分析谓词的选择性,确定优化器是否对每个表的行数做出了合理的估计

    编辑: 您提到基数估计是不正确的。这是你问题的根本原因;哈希连接和排序的成本可能还可以。在某些情况下,乐观主义者可能使用了错误的估计,因为他们不知道数据有多少是相关的。某些列上的直方图可能会有所帮助(如果您还没有得到它们),在某些情况下,您可以创建基于函数的索引并收集隐藏列上的统计信息,以便为优化人员提供更好的数据


    在一天结束时,很可能需要您指定查询中各种表的基数的技巧来获得令人满意的性能。

    所有表和索引都将被分析。大多数查询都使用绑定变量,并被调用数千次/数百万次,因此无法将其转换为使用文本。仅“分析”是不够的。您可能需要查看哪些列可能受益于直方图,或者哪些列可能受益于没有直方图。与其看成本估算,不如看行估算,看看它们是否准确。行估算是不正确的(基数通常太低),但即使这样,我也会得到更倾向于哈希连接而不是索引范围扫描的查询。有几次,为了强制索引范围扫描,我不得不暗示人为的低基数。你能提供一个解释计划的例子吗?你可以尝试各种设置(例如动态采样),但你如何知道你的更改是否有效?相反,找出计划通常很糟糕的原因,然后你就可以找到最佳解决方案了。我确实知道原因——因为哈希联接、分组方式和排序方式(但不是FTS)的成本估算不恰当。这就是我想要调整的。请看下面我的编辑。基数估计不准确是根本原因;哈希联接和排序的成本估计主要基于基数估计。