Detalles sobre el algoritmo de coincidencia MQT
Lo que sigue es una discusión generalizada de cómo funciona el algoritmo de coincidencia MQT.
Se examinan las tablas especificadas en la consulta y la MQT. Si la MQT y la consulta especifican las mismas tablas, la MQT se puede utilizar potencialmente y la coincidencia continúa. Si la MQT hace referencia a tablas no referenciadas en la consulta, se examina la tabla no referenciada para determinar si es una tabla padre en la restricción de integridad referencial. Si la clave foránea no es anulable y las dos tablas se unen utilizando una clave primaria o un predicado de clave foránea igual, la MQT puede seguir utilizándose potencialmente.
Ejemplo 3
La MQT contiene menos tablas que la consulta:
SELECT D.deptname, p.projname, sum(E.salary)
FROM DEPARTMENT D, EMPLOYEE E, EMPPROJACT EP, PROJECT P
WHERE D.deptno=E.workdept AND E.Empno=ep.empno
AND ep.projno=p.projno
GROUP BY D.DEPTNAME, p.projnameCree una MQT basada en la consulta anterior:
CREATE TABLE MQT3
AS (SELECT D.deptname, sum(E.salary) as sum_sal, e.workdept, e.empno
FROM DEPARTMENT D, EMPLOYEE E
WHERE D.deptno=E.workdept
GROUP BY D.Deptname, e.workdept, e.empno)
DATA INITIALLY IMMEDIATE REFRESH DEFERRED
ENABLE QUERY OPTIMIZATION
MAINTAINED BY USERLa consulta reescrita:
SELECT M.deptname, p.projname, SUM(M.sum_sal)
FROM MQT3 M, EMPPROJACT EP, PROJECT P
WHERE M.Empno=ep.empno AND ep.projno=p.projno
GROUP BY M.deptname, p.projnameTodos los predicados especificados en la MQT también deben especificarse en la consulta. La consulta podría contener predicados adicionales. Los predicados especificados en la MQT deben coincidir exactamente con los predicados de la consulta. Los predicados adicionales especificados en la consulta, pero no en la MQT, deben poder derivarse de las columnas proyectadas desde la MQT. Consulte el ejemplo anterior 1.
Ejemplo 4
Establezca el salario total para todos los departamentos que se encuentran en 'NY'.
SELECT D.deptname, sum(E.salary)
FROM DEPARTMENT D, EMPLOYEE E
WHERE D.deptno=E.workdept AND D.location = ?
GROUP BY D.DeptnameCree una MQT basada en la consulta anterior:
CREATE TABLE MQT4
AS (SELECT D.deptname, D.location, sum(E.salary) as sum_sal
FROM DEPARTMENT D, EMPLOYEE E
WHERE D.deptno=E.workdept AND D.location = 'NY'
GROUP BY D.deptnamet, D.location)
DATA INITIALLY IMMEDIATE REFRESH DEFERRED
ENABLE QUERY OPTIMIZATION
MAINTAINED BY USEREn este ejemplo, la constante 'NY' se ha sustituido por un marcador de parámetro y a la MQT también se le ha aplicado la selección local de ubicación = 'NY' cuando se ha rellenado la MQT. El algoritmo de coincidencia MQT coincide con el marcador de parámetro y con la constante 'NY' en el predicado D.Location=?. Verifica que los valores del marcador de parámetro son los mismos que la constante en la MQT; por lo tanto, se puede utilizar la MQT.
El algoritmo de coincidencia MQT también intenta coincidir donde los predicados entre la MQT y la consulta no son iguales. Por ejemplo, si la MQT tiene un predicado SALARY > 50000, y la consulta tiene el predicado SALARY > 70000, la MQT contiene las filas necesarias para ejecutar la consulta. La MQT se utiliza en la consulta, pero el predicado SALARY > 70000 se deja como selección en la consulta, por lo que SALARY debe ser una columna de la MQT.
Ejemplo 5
SELECT D.deptname, sum(E.salary)
FROM DEPARTMENT D, EMPLOYEE E
WHERE D.deptno=E.workdept AND D.location = 'NY'
GROUP BY D.deptnameCree una MQT basada en la consulta anterior:
CREATE TABLE MQT5
AS (SELECT D.deptname, E.salary
FROM DEPARTMENT D, EMPLOYEE E
WHERE D.deptno=E.workdept)
DATA INITIALLY IMMEDIATE REFRESH DEFERRED
ENABLE QUERY OPTIMIZATION
MAINTAINED BY USEREn este ejemplo, desde D.Location no es una columna de la MQT, no se puede determinar el predicado de selección local de consulta de usuario Location = 'NY', por lo que no se puede utilizar la MQT.
Ejemplo 6
SELECT D.deptname, sum(E.salary)
FROM DEPARTMENT D, EMPLOYEE E
WHERE D.deptno=E.workdept
GROUP BY D.deptnameCree una MQT basada en la consulta anterior:
CREATE TABLE MQT6(workdept, sumSalary)
AS (SELECT workdept, sum(salary)
FROM EMPLOYEE
GROUP BY workdept )
DATA INITIALLY IMMEDIATE REFRESH DEFERRED
ENABLE QUERY OPTIMIZATION
MAINTAINED BY USER En este ejemplo, la agregación SUM (salario) se envía a través de la unión a la tabla EMPLOYEE, lo que permite una coincidencia y sustitución de MQT6. Una reagrupación a (suma (suma (salario))) se define en la parte superior de la consulta para compensar el envío de agrupación.
En lugar de que el departamento se una a todas las filas de la tabla de empleados, ahora tiene la oportunidad de unirse a los agregados predeterminados en MQT6. Este tipo de sustitución MQT puede dar como resultado una reducción significativa del proceso y de la E/S.
Si la MQT contiene agrupación, la consulta debe ser una consulta de agrupación. El caso más sencillo es donde la MQT y la consulta especifican la misma lista de columnas de agrupación y funciones de columna.
En algunos casos, si la MQT especifica un grupo por columnas que son un superconjunto de columnas de grupo de consulta por, la consulta se puede volver a escribir para realizar el reagrupamiento. Este reagrupamiento reagrega los grupos de la MQT en los grupos necesarios para la consulta. Cuando es necesario volver a agrupar, es necesario volver a calcular las funciones de columna. La tabla siguiente muestra las expresiones de reagrupación soportadas.
Las reglas de expresión/agregación de reagrupación son:
| Consulta | MQT | Consulta final |
|---|---|---|
| COUNT (*) | COUNT (*) como recuento | SUM (recuento) |
| COUNT (*) | COUNT (C2) como cnt2 (donde c2 no admite nulos) | SUM (cnt2) |
| COUNT (c1) | COUNT (c1) como cnt | SUM (recuento) |
| COUNT (C1) (donde C1 no admite nulos) | COUNT (C2) como cnt2 (donde C2 no admite nulos) | SUM (cnt2) |
| COUNT (distinto C1) | C1 como group_c1 (donde C1 es una columna de agrupación) | COUNT (group_C1) |
| COUNT (distinto C1) | donde C1 no es una columna de agrupación | MQT no utilizable |
| COUNT (C2) donde C2 es de una tabla que no está en la MQT | COUNT (*) como recuento | cnt *COUNT (C2) |
| COUNT (distinto C2) donde C2 es de una tabla que no está en la MQT | No aplicable | COUNT (distinto C2) |
| SUM (C1) | SUM (C1) como sm | SUM (sm) |
| SUM (C1) | C1 como group_c1, COUNT (*) como cnt (donde C1 es una columna de agrupación) | SUM (group_c1 * cnt) |
| SUM (C2) donde C2 es de una tabla que no está en la MQT | COUNT (*) como recuento | cnt *SUM (C2) |
| SUM (distinto C1) | C1 como group_c1 (donde C1 es una columna de agrupación) | SUM (group_C1) |
| SUM (distinto C1) | donde C1 no es una columna de agrupación | MQT no utilizable |
| SUM (distinto C2) donde C2 es de una tabla que no está en la MQT | No aplicable | SUM (distinto C2) |
| MAX (C1) | MAX (C1) como mx | MX (mx) |
| MAX (C1) | C1 como group_C1 (donde C1 es una columna de agrupación) | MAX (group_c1) |
| MAX (C2) donde C2 es de una tabla que no está en la MQT | No aplicable | MAX (C2) |
| MIN (C1) | MIN (C1) como mn | MIN (mn) |
| MIN (C1) | C1 como group_C1 (donde C1 es una columna de agrupación) | MIN (group_c1) |
| MIN (C2) donde C2 es de una tabla que no está en la MQT | No aplicable | MIN (C2) |
| AGRUPACIÓN (C1) | GROUPING (C1) como grupo | grp |
| GROUPING (C2) donde C2 es de una tabla que no está en la MQT | No aplicable | AGRUPACIÓN (C2) |
La coincidencia MQT no da soporte a las funciones de agrupación ARRAY_AGG, XMLAGG y XMLGROUP. AVG, STDDEV, STDDEV_SAMP, VARIANCE_SAMPand VAR_POP se calculan utilizando combinaciones de COUNT y SUM. Si AVG, STDDEV o VAR_POP se incluyen en la MQT y el reagrupamiento requiere el recálculo de estas funciones, la MQT no se puede utilizar. Se recomienda que la MQT solo utilice COUNT, SUM, MIN y MAX. Si la consulta contiene AVG, STDDEV o VAR_POP, se puede volver a calcular utilizando COUNT y SUM.
Si se especifica FETCH FIRST N ROWS en la MQT, también debe especificarse FETCH FIRST N ROWS en la consulta. Además, el número de filas especificado para la MQT debe ser mayor o igual que el número de filas especificado en la consulta. No se recomienda que una MQT contenga la cláusula FETCH FIRST N ROWS.
La cláusula ORDER BY en la MQT se puede utilizar para ordenar los datos en la MQT si se ejecuta una REFRESH TABLE. Se ignora durante la coincidencia de MQT y si la consulta contiene una cláusula ORDER BY, forma parte de la consulta reescrita.