我们正在使用 Oracle 11,我最近购买了 Dell SQL Optimizer(包含在 Xpert Toad 软件包中)。今天早上我们有一条语句运行时间比平时长,在我们最终让它运行之后(缺少创建时的一些条件)我很好奇,以前从未使用过任何 SQL 优化器,它会将它更改为.它返回了同一语句的 150 多个变体,但成本最低的那个只是简单地添加到下一行。
AND o.curdate > 0 + UID * 0
我们已经有 o.curdate > 0,并且添加了“+ UID * 0”。这将运行时间从超过一分钟减少到 3 秒。我认为这与 Oracle 如何转换和处理条件有关,但我很好奇是否有任何 Oracle 专家能够提供一些关于大于零检查的添加如何将运行时间减少 15 倍的见解.谢谢!
最佳答案
UID * 0 用于向优化器隐藏 0。优化器将使用其统计数据来确定对 o.curdate > 0
使用索引扫描是否有意义。只要优化器知道 o.curdate > value
中的值,它就会这样做。但是当值未知时(这里是因为函数 UID 将在执行时被调用并以某种方式计算到值中),优化器无法预见可以访问的行的百分比,因此选择了平均最佳访问方法。
示例:您有一个 ID 为 1 到 100 的表。要求 ID > 0 将导致全表扫描,而要求 ID > 99 可能会导致索引范围扫描。当要求 ID > 0 + UID * 0 时,优化器突然对这个值视而不见,它可能会选择索引计划而不是全表扫描。
关于Oracle 中的 SQL 优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26587745/