Proceso de fusión
En el proceso de fusión, una sentencia que hace referencia a una vista o expresión de tabla se combina con la selección completa que ha definido la vista o expresión de tabla. Esta combinación crea una sentencia lógicamente equivalente. Esta sentencia equivalente se ejecuta en la base de datos.
El proceso de fusión es más efectivo que la materialización.
Ejemplo: oportunidad para proceso de fusión
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);Proceso de fusión para las expresiones de tabla correlacionadas
Db2 puede realizar el proceso de fusión para expresiones de tabla correlacionadas.
SELECT *
FROM T1,
TABLE(
SELECT T1.C2 from T3 AS T2
WHERE T1.C1 = T2.C1
) AS X;Db2 no materializa la expresión de tabla en esta consulta. La expresión se fusiona en el bloque de consulta padre, y la consulta se vuelve a crear del modo siguiente:
SELECT *
FROM T1, T3 AS T2
WHERE T1.C1 = T2.C1Proceso de fusión para vistas y expresiones de tabla con subconsultas en uniones externas
Db2 puede evitar la materialización de consultas que tengan expresiones de tabla y vistas de uniones externas a ambos lados de las uniones externas izquierda y derecha. El tipo de proceso de fusión que puede Db2 puede utilizar depende de qué lado de la unión externa contenga la vista o expresión de tabla y si la consulta contiene una subconsulta.
Por ejemplo, la consulta siguiente utiliza una unión externa izquierda y contiene referencias a una vista situada en el lado izquierdo de la unión:
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'));En tales casos, cuando la vista o la expresión de tabla está en el lado de la fila preservada de la unión, Db2 no materializa la vista para que los predicados selectivos como T1.C2
IN('712' , '713', '714') puedan aplicarse antes y reducir el tamaño de la unión.
- La vista o la expresión de tabla contiene una subconsulta.
- La vista o la expresión de tabla contiene referencias solamente a una única tabla.
Por ejemplo, Db2 fusiona la expresión de tabla para la consulta siguiente:
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 fusiona la expresión de tabla convirtiendo el predicado de subconsulta en un predicado anterior a la unión para evitar la materialización. Por ejemplo:
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;Proceso de fusión de las sentencias con las expresiones CASE, VALUE, NULLIF, IFNULL y COALESCE
Si hay expresiones CASE, VALUE, NULLIF, IFNULL o COALESCE en el lado preservado de una unión externa, Db2 puede fusionar la vista o la tabla en lugar de materializar la vista o la tabla.
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;En este caso, Db2 fusiona la expresión de tabla A, pero materializa la expresión de tabla B para aplicar la operación COALESCE antes de suministrar nulos.
Más ejemplos
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;