我们正在使用Oracle 11,我最近收购了一个戴尔SQL优化器(包括在Xpert蟾蜍包中)。今天早上我们有一个声明,运行时间比正常时间要长,在我们最终让它运行之后(创建它时缺少了一些条件),我很好奇,以前从未使用过任何SQL优化器,它会将其更改为什么。它返回了150多种相同的语句,但成本最低的一个只是添加到下面一行。
AND o.curdate > 0 + UID * 0我们已经有了o.curdate > 0,并且添加了"+ UID * 0“。这使运行时从超过一分钟减少到了3秒。我假设这与Oracle如何翻译和处理这些条件有关,但我很好奇,是否有任何Oracle专家能够提供一些见解,说明这种对大于零检查的添加如何将运行时减少了15倍。谢谢!
发布于 2014-10-27 13:33:45
UID *0用于向优化器隐藏0。优化器将使用其统计数据来确定在o.curdate > 0上使用索引扫描是否合理。只要优化器知道o.curdate > value中的值,它就会这样做。但是,当值未知时(因为函数UID将在执行时被调用,并以某种方式进入该值),优化器无法预见可以访问的行的百分比,从而选择平均最佳访问方法。
示例:您有一个ID为1到100的表。请求ID >0将导致全表扫描,而请求ID > 99可能导致索引范围扫描。当请求ID >0+ UID *0时,突然使优化器对值视而不见,它可能选择索引计划,而不是全表扫描。
https://stackoverflow.com/questions/26587745
复制相似问题