合并处理
在合并处理中,引用视图或表表达式的语句与定义视图或表表达式的全选语句合并。 这种组合会产生一个逻辑上等价的语句。 此等效语句在数据库中执行。
合并过程比具体化更有效率。
重要提示: 合并过程和MERGE语句是两个不同的概念,切勿混淆。
示例:合并处理的机会
请考虑以下语句,其中一句定义了一个观点,另一句引用了该观点:
View-defining statement: View referencing statement:
CREATE VIEW VIEW1 (VC1,VC21,VC32) AS SELECT VC1,VC21
SELECT C1,C2,C3 FROM T1 FROM VIEW1
WHERE C1 > C3; WHERE VC1 IN (A,B,C);定义视图的完整语句可以与引用视图的语句合并,得到以下逻辑等效的语句:
Merged statement:
SELECT C1,C2 FROM T1
WHERE C1 > C3 AND C1 IN (A,B,C);关联表表达式的合并处理
Db2 可以对相关表表达式执行合并处理。
SELECT *
FROM T1,
TABLE(
SELECT T1.C2 from T3 AS T2
WHERE T1.C1 = T2.C1
) AS X;Db2 不会在此查询中实现表格表达式。 该表达式合并到父查询块中,查询被改写为以下查询:
SELECT *
FROM T1, T3 AS T2
WHERE T1.C1 = T2.C1合并视图和表表达式处理,以及外部连接的子查询
Db2 对于左右外连接两侧带有表表达式和视图的查询,可以避免实体化。 Db2 可以使用的合并处理方式取决于外部联接的哪一侧包含视图或表表达式,以及查询是否包含子查询。
例如,以下查询使用左外连接,并包含对连接左侧视图的引用:
CREATE VIEW V1
AS SELECT C1, C2
FROM T3
WHERE T3.C1 IN (SELECT T4.C1
FROM T4 WHERE T4.C2 = T3.C2
GROUP BY T4.C1);
SELECT T2.C1, T2.C2, T1.C1,T2.C2
FROM V1 AS T1
LEFT OUTER JOIN
T2 ON T1.C1= T2.C1
WHERE (T1.C2 IN('712' , '713', '714'));在这种情况下,如果视图或表表达式位于连接的保留行侧,则 Db2 不会实现视图,以便 T1.C2
IN('712' , '713', '714') 等选择性谓词可以更早应用,从而减小连接的大小。
同样,如果视图或表表达式位于左或右外部联接的提供空值的一侧,且以下条件也成立,则 Db2 将合并表表达式:
- 视图或表表达式包含子查询。
- 视图或表表达式仅包含对单个表的引用。
例如, Db2 合并了以下查询的表表达式:
SELECT *
FROM T1
LEFT OUTER JOIN
(SELECT *
FROM T2
WHERE T2.C1 = (SELECT MAX(T3.C1) FROM T3 )
) TE
ON T1.C1 = TE.C1;Db2 通过将子查询谓词转换为连接前谓词来合并表表达式,从而避免实体化。 例如:
SELECT *
FROM T1
LEFT OUTER JOIN
T2 as TT
ON TT.C1 = (SELECT MAX(TTT.C1)
FROM T3 AS TTT)
AND T1.C1 = TT.C1;将语句中的处理与 CASE、VALUE、NULLIF、IFNULL和COALESCE表达式合并
如果外部联接的保留侧有 CASE、VALUE、NULLIF、IFNULL或COALESCE表达式,则 Db2 可以合并视图或表,而不是将视图或表具体化。
SELECT A.C1, B.C1, A.C2, B.C2
FROM T1 ,(SELECT COALESCE(C1, 0) ,C2
FROM T2 ) A(C1,C2)
LEFT OUTER JOIN
(SELECT COALESCE(C1, 0) ,C2
FROM T3 ) B(C1,C2)
ON A.C2 = B.C2
WHERE T1.C2 = A.C2;在这种情况下, Db2 合并表表达式A,但将表表达式B具体化,以便在提供空值之前应用COALESCE操作。
更多示例
以下语句展示了视图和表表达式可以合并的另一个示例:
SELECT * FROM V1 X
LEFT JOIN
(SELECT * FROM T2) Y ON X.C1=Y.C1
LEFT JOIN T3 Z ON X.C1=Z.C1; Merged statement:
SELECT * FROM V1 X
LEFT JOIN
T2 ON X.C1 = T2.C1
LEFT JOIN T3 Z ON X.C1 = Z.C1;