Oracle中的SQL优化

Ria*_*tle 4 sql oracle query-optimization

我们使用的是Oracle 11,最近我收购了一台Dell SQL Optimizer(包含在Xpert Toad软件包中).今天早上我们有一个声明比运行时间更长,并且在我们最终运行之后(从创建它时缺少一些条件)我很好奇,之前从未使用过任何SQL优化器,它会将它改为.它返回了相同声明的150多个变体,但成本最低的变体只是添加到以下行.

AND o.curdate > 0 + UID * 0
Run Code Online (Sandbox Code Playgroud)

我们已经有o.curdate> 0,并且添加了"+ UID*0".这将运行时间从一分钟减少到3秒.我认为它与Oracle如何翻译和处理条件有关,但我很好奇,如果任何Oracle专家都能够提供一些见解,了解如何添加大于零的检查将运行时间减少15倍.谢谢!

Tho*_*ner 6

UID*0用于隐藏优化器中的0.优化器将使用其统计数据来确定是否使用索引扫描o.curdate > 0是有意义的.只要优化器知道o.curdate > value它中的值就会这样做.但是当值未知时(这里因为函数UID将在执行时调用并以某种方式映入值),优化器无法预见可以访问的行的百分比,因此选择了最佳的访问方法.

示例:您有一个ID为1到100的表.要求ID> 0将导致全表扫描,而要求ID> 99可能会导致索引范围扫描.当要求ID> 0 + UID*0突然使优化器对该值视而不见时,它可能选择索引计划而不是全表扫描.