Cómo Db2 simplifica las operaciones de unión

Db2 puede simplificar a veces las operaciones de unión para mejorar la eficiencia de la ruta de acceso.

Iniciar la información de la interfaz de programación específica del programa. Sin embargo, debido a que las uniones externas completas son menos eficaces que las uniones a la izquierda o a la derecha y las uniones a la izquierda y a la derecha son menos eficaces que las uniones internas, las recomendaciones son siempre intentan utilizar el tipo más simple de operación de unión en las consultas.

Simplificación de predicados que eliminan los valores nulos

Db2 puede simplificar una operación de unión cuando la consulta contiene un predicado o una cláusula ON que elimina los valores nulos generados por la operación de unión.
Cláusulas ON que eliminan valores nulos

Consideremos la consulta siguiente:

SELECT * FROM T1 X FULL JOIN T2 Y
  ON X.C1=Y.C1
  WHERE X.C2 > 12;

La operación de unión externa produce estas filas de tabla de resultados:

  • Las filas con valores de C1 coincidentes de las tablas T1 y T2 (resultado de unión interna)
  • Las filas de T1 donde C1 no tiene ningún valor correspondiente en T2
  • Las filas de T2 donde C1 no tiene ningún valor correspondiente en T1

Sin embargo, cuando se aplica el predicado, se eliminan todas las filas de la tabla de resultados que proceden de T2 donde C1 no tiene ningún valor correspondiente en T1. Db2 transforma la unión completa en una unión izquierda, que es más eficiente:

SELECT * FROM T1 X LEFT JOIN T2 Y
  ON X.C1=Y.C1
  WHERE X.C2 > 12;
Predicados que eliminan los valores nulos
En la sentencia siguiente, el predicado X.C2>12 filtra todos los valores nulos que son resultado de la unión derecha:
SELECT * FROM T1 X RIGHT JOIN T2 Y
  ON X.C1=Y.C1
  WHERE X.C2>12;

Por lo tanto, Db2 puede transformar la unión a la derecha en una unión interna más eficaz sin cambiar el resultado:

SELECT * FROM T1 X INNER JOIN T2 Y
  ON X.C1=Y.C1
  WHERE X.C2>12;
Predicados que siguen a operaciones de unión
El predicado que sigue a una operación de unión debe presentar las siguientes características antes de que Db2 transforme una unión externa en una unión externa o una unión interna más simple:
  • Se trata de un predicado de término booleano.
  • El predicado es falso si una tabla de la operación de unión suministra un valor nulo para todas sus columnas.

Los predicados siguientes son ejemplos de predicados que pueden hacer que Db2 simplifique las operaciones de unión:

  • T1.C1 > 10
  • T1.C1 IS NOT NULL
  • T1.C1 > 10 OR T1.C2 > 15
  • T1.C1 > T2.C1
  • T1.C1 IN (1,2,4)
  • T1.C1 LIKE 'ABC%'
  • T1.C1 BETWEEN 10 AND 100
  • 12 BETWEEN T1.C1 AND 100
Cláusulas ON que eliminan valores no coincidentes
Este ejemplo muestra cómo Db2 puede simplificar una operación de unión porque la consulta contiene una cláusula ON que elimina filas con valores no coincidentes:
SELECT * FROM T1 X LEFT JOIN T2 Y
  FULL JOIN T3 Z ON Y.C1=Z.C1
  ON X.C1=Y.C1;

Como la última cláusula ON elimina las filas de la tabla de resultados cuyos valores de columna procedentes de T1 o T2 son nulos, Db2 puede sustituir la unión completa por una unión a la izquierda más eficaz para lograr el mismo resultado:

SELECT * FROM T1 X LEFT JOIN T2 Y
  LEFT JOIN T3 Z ON Y.C1=Z.C1
  ON X.C1=Y.C1;
Uniones externas completas procesadas como uniones externas a la izquierda
En un caso, Db2 transforma una unión externa completa en una unión a la izquierda cuando no puede escribir código para hacerlo. Se trata del caso en que una vista especifica una unión externa completa, pero una consulta subsiguiente de esa vista solo necesita una unión externa izquierda.

Por ejemplo, piense en la vista que se crea con la sentencia siguiente:

CREATE VIEW V1 (C1,T1C2,T2C2) AS
  SELECT COALESCE(T1.C1, T2.C1), T1.C2, T2.C2
  FROM T1 X FULL JOIN T2 Y
  ON T1.C1=T2.C1;

Esta vista contiene filas cuyos valores de C2 que proceden de T1 son nulos. Sin embargo, si ejecuta la consulta siguiente, se eliminan las filas con valores nulos para C2 que proceden de T1:

SELECT * FROM V1
  WHERE T1C2 > 10;

Por lo tanto, para esta consulta, sería adecuada una unión izquierda entre T1 y T2. Db2 puede ejecutar esta consulta como si la vista V1 se hubiera generado con una combinación externa izquierda, de modo que la consulta se ejecute de manera más eficiente.

Eliminación de tablas innecesarias en uniones externas a la izquierda

Cuando una sentencia SQL contiene una unión externa a la izquierda, pero no selecciona ninguna columna del lado derecho de la unión, Db2 puede eliminar la unión de la sentencia.

La tabla derecha no es necesaria si se cumple cualquiera de las condiciones siguientes:

  • Existe un índice exclusivo en la columna de clave de unión de la tabla derecha.
  • La sentencia especifica SELECT DISTINCT.

Por ejemplo, piense en la sentencia siguiente:

SELECT DISTINCT T1.C3 
FROM T1 LEFT OUTER JOIN T2
ON T1.C2 = T2.C2
WHERE T1.C1 = ?

Como la sentencia ha especificado SELECT DISTINCT, la referencia a la tabla derecha no es necesaria y Db2 puede seleccionar en su lugar una vía de acceso para la siguiente sentencia:

SELECT DISTINCT T1.C3
FROM T1
WHERE T1.C1 = ?

Como todas las referencias a la tabla derecha se han eliminado de la sentencia, los diagramas de la salida y las vías de acceso de PLAN_TABLE correspondientes a la sentencia no contienen referencias a la tabla.

Finalizar la información de la interfaz de programación específica del programa.