如何增加散列连接的Oracle CBO成本估算,分组和顺序没有提示

时间:2009-07-14 02:52:38

标签: performance oracle oracle10g optimization cbo

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

进一步说明:

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

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

1 个答案:

答案 0 :(得分:2)

通常情况下,具有索引范围扫描的执行计划优于具有完全扫描+排序或散列连接的执行计划,但CBO正在选择完整扫描,这是因为优化器认为它将找到比实际实际获得的更多匹配结果寿命。

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

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

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

在一天结束时,您可能需要在查询中指定各种表格的基数才能获得满意的效果。