购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

5.尽量将In子查询重写为Exists子查询

In和Exists子查询可以生成同样的结果,不过它们的做法截然不同。通常它们的表现各有优劣,这取决于实际的数据分布。例如:


SELECT E.EMPNO, E.LASTNAME

FROM EMP E

WHERE E.EMPNO IN

(SELECT D.MGRNO

FROM DEPARTMENT D

WHERE D.DEPTNO LIKE'D%')


也可以写为:


SELECT E.EMPNO, E.LASTNAME

FROM EMP E

WHERE EXISTS

(SELECT 1

FROM DEPARTMENT D

WHERE D.MGRNO=E.EMPNO

AND D.DEPTNO LIKE'D%')


这些相关子查询和非相关子查询有不同的处理优势。现在DB2 V9可能会把子查询转换为它认为更高效的类型,特别是当一个子查询无法转换为联接时,V9就会转换子查询类型。DB2可能选择将子查询转换为联接来处理重复结果。这样一来,在查看DB2 Explain时,可能看不到之前编写的那个子查询,而是会看到一个联接或者另一种类型的子查询,这可能会让人有些困惑。

DB2的做法是根据成本来关联、解除关联或转换为一个联接。IBM Data Studio工具可以显示优化工具完成的查询转换。 a2zAez+CNFhhxeTr0EqzsFpbgjAUPtlC/9L1WjHFtMVWQpOOQ+6eg/SGur2SGZ9+

点击中间区域
呼出菜单
上一章
目录
下一章
×