Oracle中的SQL优化

5

我们正在使用Oracle 11,最近我获得了Dell SQL Optimizer(包含在Xpert Toad软件包中)。今天早上我们有一条语句运行时间比平常长,最终在缺少创建时的某些条件的情况下才运行成功。由于我以前从未使用过任何SQL优化器,因此我很好奇它会对语句进行什么更改。结果返回了150多个相同语句的变体,但成本最低的那个只是在以下行添加了内容。

AND o.curdate > 0 + UID * 0

我们已经有o.curdate > 0,然后添加了“+ UID * 0”。这将运行时间从一分钟减少到3秒。我认为这与Oracle如何翻译和处理条件有关,但我很好奇是否有任何Oracle高手能够提供关于如何通过增加大于零检查来降低运行时间15倍的见解。谢谢!

3
检查两个语句的执行计划。 - user330315
没有完整的查询语句,很难说除了需要检查执行计划之外还有什么。我最好的猜测是这可能会阻止使用curdate索引,这可能是次优的。更新统计信息可能会产生相同的效果。 - Gordon Linoff
我按照建议进行了操作,但更改后的语句在Toad中没有呈现计划。我注意到SQL Optimizer软件正在对四个表(其中一个是别名为“o”的ORDERS表)进行全表扫描,而更改后则没有全表扫描。 - RianBattle
1个回答

7
UID * 0用于隐藏0,以避免优化器使用统计数据判断在o.curdate > 0上使用索引扫描是否有意义。只要优化器知道o.curdate > value中的值就会这样做。但是当值未知(因为函数UID将在执行时被调用并与值匹配),优化器无法预见可能访问多少行,因此选择平均最佳访问方法。
例如:您有一个ID为1到100的表。查询ID > 0将导致全表扫描,而查询ID > 99则很可能导致索引范围扫描。当查询ID > 0 + UID * 0时,优化器突然失去了对值的了解,它可能会选择索引计划而不是全表扫描。

1
非常感谢,这让我很有收获!为了以后的参考,我需要更深入地了解这些语句的工作原理,像这样的细节对效率有很大的影响。正如我在上面评论的那样,第一个语句在四个表中进行了完整的表扫描(其中一个是包含curdate的表),加上这个语句之后,根据优化器软件,它不再执行任何操作...不确定为什么Toad没有显示第二个语句的计划。再次感谢! - RianBattle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接