Oracle中的SQL优化

Oracle中的SQL优化,sql,oracle,query-optimization,Sql,Oracle,Query Optimization,我们使用的是Oracle 11,我最近购买了一个Dell SQL Optimizer(包含在Xpert Toad软件包中)。今天早上我们有一个语句,它的运行时间比正常情况下要长,在我们最终运行它(缺少创建它时的一些条件)之后,我很好奇,以前从未使用过任何SQL优化器,它会将它更改为什么。它带来了同一声明的150多个变体,但成本最低的一个只是添加到下一行 AND o.curdate > 0 + UID * 0 我们已经有了o.curdate>0,并且添加了“+UID*0”。这将运行时间从一

我们使用的是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时,优化器会突然对该值视而不见,它可能会选择索引计划而不是全表扫描。

检查这两条语句的执行计划。如果没有完整的查询,除了需要检查执行计划之外,很难说出其他任何话。我最好的猜测是,这会阻止在
curdate
上使用索引,这可能是次优的。更新统计数据可能会产生同样的效果。我按照建议这样做了,但带有更改的声明并没有通过Toad显示计划。我确实在SQL Optimizer软件中注意到,它正在对四个表(其中一个是ORDERS,别名为“o”)进行完整的表扫描,更改后没有完整的表扫描。非常感谢,这很有意义!我需要更深入地了解这些语句是如何工作的,以备将来参考。我想,像这样的小细节会大大提高效率。正如我在上面所评论的,第一条语句对其中四个表(其中一个是包含curdate的表)进行了完整的表扫描,并且通过这个添加,它不再根据优化器软件进行任何操作……不确定为什么Toad没有显示第二条语句的计划。再次感谢!