代码之家  ›  专栏  ›  技术社区  ›  Andrew not the Saint

如何在没有提示的情况下增加哈希连接、分组方式和排序方式的Oracle CBO成本估算

  •  2
  • Andrew not the Saint  · 技术社区  · 17 年前

    似乎在我们拥有的一些服务器上,哈希连接、分组和排序的成本与实际成本相比太低了。即,通常具有指数范围扫描的执行计划会优于前者,但在解释计划中,成本会更高。

    一些进一步的说明:

    1. 我已经设置好了
    2. pga_aggregate_target 对CBO成本估算产生影响,但我绝对不想降低这个参数,因为我们有足够的RAM。
    3. 与在单个查询中使用优化器提示不同,我希望设置是全局的。

    非常稳定 ,事实上,对于我们的一些最大的客户,我们有一项锁定所有统计数据的政策(这将随着Oracle 11g SQL计划管理而改变)。

    1 回复  |  直到 17 年前
        1
  •  2
  •   Jeffrey Kemp    17 年前

    换句话说,如果优化器认为它将从表A中获得1M行,从表B中获得1000行,它很可能会选择全扫描+排序合并或哈希连接;然而,如果它实际运行查询时,只从表A中获取1行,那么索引范围扫描可能会更好。

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

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