似乎在我们拥有的某些服务器上,散列连接,分组和顺序的成本与实际成本相比太低。即通常,索引范围扫描的执行计划优于前者,但在解释计划中,成本显示为更高。
进一步说明:
编辑1:我正在考虑尝试动态采样,但我没有足够的知识来预测这会如何影响整体性能,即执行计划可能发生变化的频率。我肯定更喜欢非常稳定的东西,实际上对于我们的一些大客户,我们有一个锁定所有统计数据的策略(这将随Oracle 11g SQL计划管理而改变)。
答案 0 :(得分:2)
通常情况下,具有索引范围扫描的执行计划优于具有完全扫描+排序或散列连接的执行计划,但CBO正在选择完整扫描,这是因为优化器认为它将找到比实际实际获得的更多匹配结果寿命。
换句话说,如果优化器认为它将从表A获得1M行,从表B获得1000行,那么它可能选择完全扫描+排序合并或散列连接;但是,如果它实际运行查询时,它只从表A获得1行,则索引范围扫描可能会更好。
我首先看一些表现不佳的查询并分析谓词的选择性,确定优化器是否对每个表的行数做出合理的估计。
编辑: 您已经提到基数估计值不正确。这是你问题的根本原因;散列连接和排序的成本可能相当不错。在某些情况下,优化器可能使用错误的估计值,因为它不知道数据的相关程度。某些列上的直方图可能有所帮助(如果您尚未获得它们),并且在某些情况下,您可以创建基于函数的索引并收集隐藏列的统计信息,以便为优化器提供更好的数据。
在一天结束时,您可能需要在查询中指定各种表格的基数才能获得满意的效果。