Materialización
Las expresiones de vistas y tablas no siempre se pueden fusionar. En determinados casos, Db2 materializa la vista o la expresión de tabla
- La selección completa que define la vista o expresión de tabla se ejecuta en la base de datos y los resultados se colocan en una copia temporal de una tabla de resultados.
- Después se ejecuta la sentencia que hace referencia a la vista o expresión de tabla en la copia temporal de la tabla de resultados para obtener el resultado.
Ejemplo
Consulte las sentencias siguientes:
- Sentencia que define una vista
CREATE VIEW VIEW1 (VC1,VC2) AS SELECT SUM(C1),C2 FROM T1 GROUP BY C2;- Sentencia de referencia a una vista
SELECT MAX(VC1) FROM VIEW1;
La columna VC1 aparece como argumento de una función de totales
en la sentencia de referencia a vista. Los valores de VC1, tal como los define la selección completa que define la vista,
son el resultado de aplicar la función de totales SUM(C1) a grupos después de agrupar la tabla base T1
por la columna C2. No se puede ejecutar ninguna sentencia de SQL SELECT individual equivalente en
la tabla base T1 para conseguir el resultado. No puede especificar que las funciones de agregación se apliquen de forma sucesiva.
Cuándo se materializan las vistas y expresiones de tabla anidadas
Db2 utiliza la materialización para satisfacer una referencia a una vista o expresión de tabla cuando hay implicado un proceso de agregación (como, por ejemplo, la agrupación, funciones de agregación y operaciones distintas). Este proceso se indica definiendo fullselect, con el proceso de agregación indicado por la sentencia que hace referencia a la vista o expresión de tabla o bien mediante la vista o expresión de tabla que participa en una unión. Para las vistas y expresiones de tabla que se definen con los operadores de conjunto, Db2 puede distribuir a menudo el proceso de agregación, uniones y predicados cualificados para evitar la materialización.
La tabla siguiente indica algunos casos en que se produce la materialización. Db2 también puede utilizar la materialización en sentencias que contengan múltiples uniones externas, uniones externas que se combinen con uniones internas o fusiones que provoquen una unión de más de 15 tablas.
| La vista SELECT FROM o la expresión de tabla utiliza...1 | La definición de vista o la expresión de tabla2 utiliza GROUP BY | La definición de vista o la expresión de tabla2 utiliza DISTINCT | La definición de vista o la expresión de tabla2 utiliza la función de totales | La definición de vista o la expresión de tabla2 utiliza la función de totales DISTINCT | La definición de vista o la expresión de tabla2 utiliza UNION | La definición de vista o la expresión de tabla2 utiliza UNION ALL4 |
|---|---|---|---|---|---|---|
| Uniones 3 | X | X | X | X | X | |
| GROUP BY | X | X | X | X | X | |
| DISTINCT | X | X | X | |||
| Función de agregación | X | X | X | X | X | X |
| Función de totales DISTINCT | X | X | X | X | X | |
| Subconjunto SELECT de las columnas de vista o expresión de tabla | X | X |
- Si se hace referencia a la vista como el destino de una operación de inserción, actualización o
supresión para satisfacer la referencia a vista. Sólo las vistas actualizables pueden ser el destino de las operaciones de inserción, actualización o supresión.
Una sentencia de SQL puede hacer referencia a una vista en particular varias veces cuando algunas de las referencias se pueden fusionar y otras se deben materializar.
- Si una lista SELECT contiene una variable de lenguaje principal en una expresión de tabla, se produce
la materialización. Por ejemplo:
SELECT C1 FROM (SELECT :HV1 AS C1 FROM T1) X;Si se define una vista o expresión de tabla anidada para que contenga una función definida por el usuario y si esta función definida por el usuario está definida como NOT DETERMINISTIC o EXTERNAL ACTION, la vista o expresión de tabla anidada siempre se materializa.
- Detalles adicionales acerca de la materialización con uniones externas:
- Si existe una cláusula WHERE en una vista o expresión de tabla, y no contiene ninguna
columna, se produce la materialización.
SELECT X.C1 FROM (SELECT C1 FROM T1 WHERE 1=1) X LEFT JOIN T2 Y ON X.C1=Y.C1; - Si la unión externa es una unión externa completa y la lista SELECT de la vista o expresión de
tabla anidada no contiene una columna autónoma para la columna que se utiliza en la cláusula
ON de la unión externa, se produce la materialización.
SELECT X.C1 FROM (SELECT C1+10 AS C2 FROM T1) X FULL JOIN T2 Y ON X.C2=Y.C2; - Si la lista SELECT de una vista o expresión de tabla anidada no contiene ninguna columna,
se produce la materialización.
SELECT X.C1 FROM (SELECT 1+2+:HV1. AS C1 FROM T1) X LEFT JOIN T2 Y ON X.C1=Y.C1; - Si se cumplen ciertas
condiciones, la materialización puede evitarse cuando una unión externa izquierda o derecha contiene los siguientes tipos
de expresiones: CASE, COALESCE o VALUE.
Si la vista de filas conservadas o la expresión de tabla (el lado izquierdo de una unión izquierda) contiene una expresión CASE, COALESCE o VALUE, la vista o la expresión de tabla se materializa solo si se hace referencia a la expresión en un predicado de cláusula ON o WHERE fuera de la expresión de tabla. Una referencia en la lista de selección a la expresión CASE, COALESCE o VALUE en el lado de la fila conservada no causa materialización.
Sin embargo, si la vista con suministro nulo o la expresión de tabla (el lado derecho de una unión izquierda) contiene una expresión CASE, COALESCE o VALUE, la vista o la expresión de tabla se materializa solo si se hace referencia a la expresión como un predicado o en la lista de selección en la consulta exterior.
Por ejemplo, considere la sentencia siguiente:
SELECT A.C1, B.C1, A.C2, B.C2 FROM T1 ,(SELECT COALESCE(C1, 0) AS C1 ,C2 FROM T2 ) A LEFT OUTER JOIN (SELECT COALESCE(C1, 0) AS C1 ,C2 FROM T3 ) B ON A.C2 = B.C2 WHERE T1.C2 = A.C2;A es la expresión de tabla conservada de una unión externa a la izquierda. Puesto que ningún predicado hace referencia a A.C1, la materialización puede evitarse para la expresión de tabla A.
B es la expresión de tabla de suministro nulo de la unión externa a la izquierda. Puesto que se hace referencia a B.C1 en la lista de selección de la sentencia, la expresión de tabla B debe materializarse. Si cualquier predicado contenía una referencia a B.C1, eso requeriría la materialización de la expresión de tabla B.
- Si existe una cláusula WHERE en una vista o expresión de tabla, y no contiene ninguna
columna, se produce la materialización.
- Db2 no puede evitar la materialización de UNION ALL en todos los casos. Algunas de las situaciones en que se produce
la materialización son:
- Cuando la vista es el operando de una unión externa para la que se utilizan nulos para valores que no coinciden, se produce la materialización. Esta situación se produce cuándo la vista es un operando en una unión externa completa, el operando derecho de una unión externa izquierda o el operando izquierdo de una unión externa derecha.
- Si el número de tablas va a exceder de 225 después de la distribución, ésta no se produce y el resultado se materializa.
- Para los operadores de conjunto INTERSECT y EXCEPT, la información de EXPLAIN puede ayudar a determinar si la vista se materializa.