在我们有的服务器上,与实际成本相比,散列连接、按‘s分组和order’s的成本似乎太低了。也就是说,通常使用索引范围扫描的执行计划的性能优于前者,但在解释计划上,成本会更高。
一些进一步的说明:
编辑1:我正在考虑尝试动态抽样,但我没有足够的亲密知识来预测这会如何影响整体性能,即执行计划可能改变的频率。我肯定更喜欢非常稳定的,事实上,对于一些最大的客户端,我们有一个锁定所有统计数据的策略(这将随着Oracle11gSQLPlainManagement而改变)。
发布于 2009-07-14 09:18:15
通常情况下,使用索引范围扫描的执行计划比具有完整扫描+排序或散列连接的执行计划的性能要好,但是CBO选择了完整的扫描,这是因为优化者认为它会找到比实际得到的更多的匹配结果。
换句话说,如果优化器认为它将从表A获得100万行,从表B获得1000行,则很可能选择完全扫描+排序合并或散列连接;但是,如果当它实际运行查询时,它只从表A获得1行,则索引范围扫描很可能会更好。
首先,我将查看一些性能不佳的查询,分析谓词的选择性,确定优化器是否对每个表的行数进行了合理的估计。
编辑:您已经提到基数估计是不正确的。这是导致您的问题的根本原因;散列、连接和排序的成本计算可能很好。在某些情况下,优化器可能使用错误的估计,因为它不知道数据之间的关联程度。某些列上的直方图可能会有所帮助(如果您还没有得到它们),在某些情况下,您可以创建基于函数的索引,并收集隐藏列的统计信息,以便向优化器提供更好的数据。
最后,您在查询中指定各种表的基数的技巧很可能是获得满意性能所必需的。
https://stackoverflow.com/questions/1123219
复制相似问题