7. 由于优化工具处理“或”逻辑可能有问题,所以尽量采用其他方式重写
2013-07-12 09:15
176 查看
尽可能分离谓词。下面的例子可以说明这一点:
SELECT DEPTNO, DEPTNAME
FROM DEPT
WHERE (ADMRDEPT = 'E01'
AND DEPTNAME LIKE 'BRANCH%')
OR (DEPTNO = 'D01'
AND DEPTNAME LIKE 'BRANCH%')
也可以写作:
SELECT DEPTNO, DEPTNAME
FROM DEPT
WHERE (ADMRDEPT = 'E01' OR
DEPTNO = 'D01')
AND DEPTNAME LIKE 'BRANCH%'
这里的关键是:可以看到这两个例子有相同的逻辑。
很多情况下,这会使优化工具从不可索引谓词转移到可索引的谓词,或者可能使优化工具选择一个多索引处理访问路径,也可能不再选择多索引处理。用“或”(OR)逻辑连接两个谓词会创建非布尔项谓词,这意味着即使某个谓词为false,也不能因此完全消除一行,所以通常最好避免用OR连接谓词。也许一个谓词为false,但另一个可能是true。相比之下,使用“与”(AND)逻辑来连接谓词通常更为高效。不过,在这种情况下,它能为优化工具提供更多选择。
如果谓词用 “OR”连接,首先要把谓词写为与表中最大数目的行匹配,这很重要。因为一旦某一行满足条件,OR列表中的谓词计算就会结束。
用OR逻辑连接简单谓词时,得到的复合谓词会在简单谓词第1阶段或第2阶段中相对高的阶段完成计算。例如:
SELECT EMPNO, LASTNAME, SALARY
FROM EMP
WHERE WORKDEPT = 'D01' -- Stage 1 Indexable
OR EDLEVEL <> 16 -- Stage 1 Non Indexable
由于第二个谓词是一个Stage 1不可索引谓词,而另一个简单谓词是一个Stage 1可索引谓词,所以整个复合谓词会成为一个Stage 1不可索引谓词:
SELECT EMPNO, LASTNAME, SALARY
FROM EMP
WHERE WORKDEPT = 'D01' -- Stage 1 Indexable
OR YEAR(HIREDATE ) = 1990 -- Stage 2
由于第二个谓词是一个Stage 2不可索引谓词,而另一个简单谓词是一个Stage 1可索引谓词,所以整个复合谓词是一个Stage 2不可索引谓词。
SELECT DEPTNO, DEPTNAME
FROM DEPT
WHERE (ADMRDEPT = 'E01'
AND DEPTNAME LIKE 'BRANCH%')
OR (DEPTNO = 'D01'
AND DEPTNAME LIKE 'BRANCH%')
也可以写作:
SELECT DEPTNO, DEPTNAME
FROM DEPT
WHERE (ADMRDEPT = 'E01' OR
DEPTNO = 'D01')
AND DEPTNAME LIKE 'BRANCH%'
这里的关键是:可以看到这两个例子有相同的逻辑。
很多情况下,这会使优化工具从不可索引谓词转移到可索引的谓词,或者可能使优化工具选择一个多索引处理访问路径,也可能不再选择多索引处理。用“或”(OR)逻辑连接两个谓词会创建非布尔项谓词,这意味着即使某个谓词为false,也不能因此完全消除一行,所以通常最好避免用OR连接谓词。也许一个谓词为false,但另一个可能是true。相比之下,使用“与”(AND)逻辑来连接谓词通常更为高效。不过,在这种情况下,它能为优化工具提供更多选择。
如果谓词用 “OR”连接,首先要把谓词写为与表中最大数目的行匹配,这很重要。因为一旦某一行满足条件,OR列表中的谓词计算就会结束。
用OR逻辑连接简单谓词时,得到的复合谓词会在简单谓词第1阶段或第2阶段中相对高的阶段完成计算。例如:
SELECT EMPNO, LASTNAME, SALARY
FROM EMP
WHERE WORKDEPT = 'D01' -- Stage 1 Indexable
OR EDLEVEL <> 16 -- Stage 1 Non Indexable
由于第二个谓词是一个Stage 1不可索引谓词,而另一个简单谓词是一个Stage 1可索引谓词,所以整个复合谓词会成为一个Stage 1不可索引谓词:
SELECT EMPNO, LASTNAME, SALARY
FROM EMP
WHERE WORKDEPT = 'D01' -- Stage 1 Indexable
OR YEAR(HIREDATE ) = 1990 -- Stage 2
由于第二个谓词是一个Stage 2不可索引谓词,而另一个简单谓词是一个Stage 1可索引谓词,所以整个复合谓词是一个Stage 2不可索引谓词。
相关文章推荐
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview效率检视工具,分析程序运行速度!并讲解两种创建SDcard方式!
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- (转)【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview效率检视工具,分析程序运行速度!并讲解两种创建SDcard方式!
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview效率检视工具,分析程序运行速度!并讲解两种创建SDcard方式!
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- 10—(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- (优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式! .
- 转:WCF跨域 这可能是由于试图以跨域方式访问服务而又没有正确的跨域策略,或策略不适用于 SOAP
- C# 采用系统委托的方式处理线程内操作窗体控件
- 【码云周刊第 18 期】假日照片堆积如何处理?这些工具你可能用得上
- Java 重写与重载区别 Java父类的Object方法 要重写tostring原因,多个catch处理逻辑
- 阿里云部署Web API 总结(及其他可能部署方式)
- OGG由于GGS处理SEQUENCE方式导致Ext延时_NOAUTOMATICSEQUENCEFLUSH处理
- 采用axis2c进行webservice发布的流程4-在生成的代码中添加事务处理逻辑
- 【WCF】 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:00:56.9810000”。