2

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

一些进一步的说明:

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

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

4

1 回答 1

2

很多时候,当索引范围扫描的执行计划优于完全扫描+排序或散列连接的执行计划时,但 CBO 正在选择完全扫描,这是因为优化器认为它会找到比实际生活中更多的匹配结果。

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

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

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

归根结底,您可能需要在查询中指定各种表的基数才能获得令人满意的性能。

于 2009-07-14T09:18:15.423 回答