Unión de bucle anidado (METHOD=1)

En una unión de bucle, Db2 explora la tabla compuesta (externa). Para cada fila de dicha tabla que proceda (que cumpla los predicados de la tabla), Db2 busca filas coincidentes de la tabla nueva (interna).

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

Db2 concatena las filas coincidentes que encuentra con la fila actual de la tabla compuesta. Si no coincide ninguna fila con la fila actual:

  • Para una unión interna, Db2 descarta la fila actual.
  • Para una unión externa, Db2 concatena una fila de valores nulos.

Los predicados de la etapa 1 y la etapa 2 eliminan las filas no calificadas durante la unión. (Para una explicación de esos tipos de predicados, véase Predicados de etapa 1 y etapa 2 ) Db2 puede escanear cualquiera de las tablas utilizando cualquiera de los métodos de acceso disponibles, incluido el escaneo de espacio de tabla. Finalizar la información de la interfaz de programación específica del programa.

Consideraciones sobre el rendimiento para unión de bucle anidado

Una unión de bucle anidado explora de forma repetida la tabla interna de la unión.

Es decir, Db2 explora la tabla externa una vez y explora la tabla interna tantas veces como filas cualificadas tenga la tabla externa. Por lo tanto, la unión de bucle anidado suele ser el método de unión más eficaz cuando los valores de la columna de unión que se pasan a la tabla interna son secuenciales y el índice de la columna de unión de la tabla interna se agrupa en clústeres o el número de filas recuperadas de la tabla interna a través del índice es reducido.

Cuándo se utiliza la unión de bucle anidado

Db2 a menudo utiliza una unión de bucle anidado en las situaciones siguientes.

  • La tabla externa es pequeña.
  • Los predicados con factores de filtro pequeños reducen el número de filas calificadoras en la tabla externa.
  • O bien existe un índice altamente agrupado y eficiente en las columnas de unión de la tabla interna , o Db2 puede crear dinámicamente un índice disperso en la tabla interna y usar ese índice para el acceso posterior.
  • El número de páginas de datos accedidas de la tabla interna es reducido.
  • No existen columnas de unión. Las uniones híbridas y de fusión de listas ordenadas necesitan columnas de unión; las uniones de bucle anidado no.

Ejemplo: unión externa izquierda

La figura siguiente ilustra un bucle anidado para una unión externa izquierda. La unión externa conserva la fila no coincidente en OUTERT con los valores A=10 y B=6. El mismo método de unión para una unión interna solo difiere en que descarta esa fila. La figura siguiente ilustra una unión de bucle anidado.

Figura 1. Unión de bucle anidado para una unión externa izquierda
Comenzar descripción de figura. Un diagrama de flujo con datos de
ejemplo que muestran cómo se realiza una unión de exploración de fusión. Finalizar descripción de figura.

Ejemplo: prioridad de tabla de una fila

Para un caso como el siguiente ejemplo, con un índice único en T1.C2, Db2 detecta que T1 solo tiene una fila que satisface la condición de búsqueda. Db2 hace que T1 sea la primera tabla en una combinación de bucles anidados.

SELECT * FROM T1, T2
  WHERE  T1.C1 = T2.C1 AND
         T1.C2 = 5;

Ejemplo: unión cartesiana con tablas pequeñas primero

Una unión cartesiana es una forma de unión de bucle anidado en la que no existen predicados de unión entre las dos tablas. Db2 suele evitarse una unión cartesiana, pero a veces es el método más eficiente, como en el siguiente ejemplo. La consulta utiliza tres tablas: T1 contiene 2 filas, T2 contiene 3 filas y T3 contiene 10 millones de filas.
SELECT * FROM T1, T2, T3
  WHERE  T1.C1 = T3.C1 AND
         T2.C2 = T3.C2 AND
         T3.C3 = 5;

Los predicados de unión se encuentran entre T1 y T3 y entre T2 y T3. Ningún predicado une T1 y T2.

Supongamos que 5 millones de filas de T3 tienen el valor C3=5. El tiempo de proceso es elevado si T3 es la tabla externa de la unión y se accede a las tablas T1 y T2 para cada uno de los 5 millones de filas.

Sin embargo, si se unen todas las filas de T1 y T2, sin un predicado de unión, sólo se accede a los 5 millones de filas seis veces, una vez para cada fila de la unión cartesiana de T1 y T2. Es difícil decir cuál es la vía de acceso más eficaz. Db2 evalúa las diferentes opciones y podría decidir acceder a las tablas en la secuencia T1, T2, T3. Finalizar la información de la interfaz de programación específica del programa.

Clasificaciones en la tabla compuesta

Iniciar la información de la interfaz de programación específica del programa. Db2 podría ordenar la tabla compuesta bajo las condiciones siguientes:

  • Las columnas de unión de la tabla compuesta y de la tabla nueva no tienen la misma secuencia.
  • La columna de unión de la tabla compuesta no tiene ningún índice.
  • El índice tiene pocos clústeres.

Una unión de bucle anidado con una tabla compuesta clasificada tiene las siguientes ventajas de rendimiento:

  • Utiliza la detección secuencial de forma eficaz para la captación previa de páginas de datos de la tabla nueva, lo que reduce el número de operaciones de E/S síncrona y el tiempo transcurrido.
  • Evita los sondeos completos repetitivos del índice de la tabla interna utilizando la conversión de índice.Finalizar la información de la interfaz de programación específica del programa.

Unión de bucle anidado con acceso de índice disperso

Un valor de PRIMARY_ACCESSTYPE = T indica que Db2 crea dinámicamente un índice disperso en la tabla interna y utiliza el índice disperso para buscar en el archivo de trabajo que se crea en la tabla interna.

Una unión de bucle anidado con un índice disperso tiene las siguientes ventajas de rendimiento:

  • El acceso a la tabla interna es más eficaz cuando la tabla interna no tiene ningún índice eficaz en las columnas de unión.
  • Se evita una clasificación de la tabla compuesta cuando la tabla compuesta es relativamente grande.

Inicio del cambioLa modalidad utilizada para las hebras de acceso a bases de datos se controla mediante el valor del parámetro de subsistema MXDTCACH. Sin embargo, si el almacenamiento disponible es insuficiente cuando se ejecuta la consulta, es posible que Db2 no pueda crear el índice disperso, lo que degradaría el rendimiento. La solución es resolver la falta de memoria. Sin embargo, si no puede hacerlo, reduzca la configuración MXDTCACH.Finalizar la información de la interfaz de programación específica del programa.fin del cambio