使用关联子查询处理一个SQL语句时有几点需要注意:
·可能要执行多次关联子查询来满足SQL请求。考虑到这一点,必须使用一个索引来处理子查询以减少表空间扫描。
·如果关联子查询会执行成千上万甚至上百万次,最好使用Indexonly=Yes确保使用一个索引来执行子查询。这可能需要对索引有所改变,或者要对一个已经存在的索引进行调整。例如:
SELECT E.EMPNO, E.LASTNAME
FROM EMP E
WHERE EXISTS
(SELECT 1
FROM DEPT D
WHERE D.MGRNO=E.EMPNO
AND D.DEPTNO LIKE'D%')
在这个例子中,会对EMP表中各个不同的EMPNO执行子查询。这个子查询会使用一个索引(MGRNO索引),不过接下来必须在表的数据文件中检查谓词D.DEPTNO LIKE‘D%’。
每次执行这个子查询时,可能会发生两个I/O:一个是对索引文件的I/O,另一个对应表的数据文件。这个子查询只执行32次,所以影响不会太大,不过如果外查询向子查询提供数百万个值,那么这些额外的I/O就会急剧累加。对于这种情况,我建议修改MGRNO上的索引,增加列DEPTNO,这样索引就同时包含这两个列(MGRNO, DEPTNO),从而能消除第二个可能出现的数据文件I/O(和/或进一步的获取页面I/O)。对于子查询处理,DB2 Explain将把优化显示为Indexonly=Yes。
对于执行上百万次的子查询,这种方法会显著影响运行时性能。