sql >> Base de Datos >  >> RDS >> Oracle

Unión de bucle anidado en Oracle 11g

Índice

  • ¿Qué es la combinación de bucle anidado en Oracle?
  • cómo funciona la combinación de bucles anidados en Oracle
  • Nuevo método para unión de bucle anidado en Oracle 11g
  • Unión externa de bucles anidados en Oracle

¿Qué es la combinación de bucle anidado en Oracle?

-Para cada fila en la fuente de la primera fila, acceda a todas las filas de la fuente de la segunda fila.
-La unión de BUCLES NESTED es una operación de unión que selecciona una fila de la fuente de fila inicial seleccionada y utiliza los valores de esta fuente de fila para ingresar o seleccionar desde la fuente de la fila unida buscando la fila coincidente.
-Mejor para transacciones de tipo OLTP
-será más rápido si las filas devueltas desde la primera tabla son pequeñas

-La unión de bucle anidado en Oracle 11g funciona de manera diferente. Los detalles al respecto se brindan en este artículo

cómo funciona la combinación de bucles anidados en Oracle

-El optimizador de Oracle primero determina la tabla de conducción y la designa como el bucle externo. Esta es la fuente de la fila de conducción. Produce un conjunto de filas para impulsar la condición de unión. El origen de la fila puede ser una tabla a la que se accede mediante la exploración de índice o la exploración de tabla completa. Las filas también se pueden producir a partir de cualquier otra operación. Por ejemplo, la salida de una combinación de bucle anidado se puede utilizar como fuente de fila.
-El optimizador designa otra tabla como bucle interno. Esto se repite para cada fila devuelta desde el bucle externo. Esta es una operación de acceso en una tabla e idealmente debería ser un escaneo de índice.
-La operación realizada por la tabla INNER se repite para cada fila devuelta en la tabla OUTER

for x in (select from outer table)
loop
for row in (select from inner table )
loop
joined output rows is returned where condition is matched
end loop
end loop

Ejemplo de combinación de bucle anidado

select /* +use_nl( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no;
SELECT STATEMENT
NESTED LOOP
TABLE ACCESS FULL DEPT
TABLE ACCESS BY INDEX ROWID EMP
INDEX RANGE SCAN EMP_N1

Cómo se procesa

(1) Lea la primera fila en DEPT
(2) Realice el escaneo de índice en EMP_N1 para buscar coincidencias dept_no y obtenga el primer rowid
(3) Busque la fila a la que se hace referencia en EMP y únase a la información y proporcione salida
(4) Repita la operación 2,3 para cada ID de fila devuelto
(5) Repita la operación 1,2,3,4 para todas las filas en DEPT

for x in (seleccione del departamento de la tabla)
loop
for row in (seleccione del emp de la tabla)
loop
las filas de salida unidas se devuelven donde la condición coincide
end bucle
bucle final

Aquí, el método de acceso para seleccionar desde la tabla emp sería a través del escaneo de índice
Si el optimizador elige usar algún otro método de combinación, puede usar la sugerencia USE_NL (A B), donde A y B son los alias de las tablas siendo unido.

Cálculos de costos
En una combinación de NESTED LOOPS, para cada fila en el conjunto de filas externo, se accede al conjunto de filas interno para encontrar todas las filas coincidentes para unir. Por lo tanto, en este tipo de combinación, se accede al conjunto de filas interno tantas veces como el número de filas en el conjunto de filas externo.
Coste :costo de acceso a la tabla A + número de filas devueltas de la tabla A X costo de acceso a la tabla B

Por lo tanto, esto será rentable si se devuelven filas pequeñas de la tabla externa y la operación de acceso a la tabla interna se realiza a través de un escaneo único o un escaneo de rango de índice pequeño

Nuevo método para unión de bucle anidado en Oracle 11g

SELECT STATEMENT
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS FULL DEPT
INDEX UNIQUE SCAN EMP_IDX
TABLE ACCESS BY INDEX ROWID EMP

La documentación de Oracle dice esto sobre
Cuando un índice o un bloque de tabla no está en la memoria caché del búfer y se necesita para procesar la combinación, se requiere una E/S física. En Oracle Database 11g versión 1 (11.1), Oracle Database puede procesar por lotes varias solicitudes de E/S físicas y procesarlas mediante una E/S de vector en lugar de procesarlas de una en una. Como parte de la nueva implementación para uniones de bucles anidados, es posible que aparezcan dos orígenes de filas de unión de BUCLES NESTED en el plan de ejecución donde solo uno habría aparecido en versiones anteriores. En tales casos, Oracle Database asigna un origen de fila de combinación NESTED LOOPS para unir los valores de la tabla en el lado externo de la combinación con el índice en el lado interno. Se asigna una fuente de segunda fila para unir el resultado de la primera unión, que incluye los ID de fila almacenados en el índice de Oracle, con la tabla en el lado interior de la unión”

Unión externa de bucles anidados en Oracle

-Similar al bucle anidado
-Filas devueltas incluso si el bucle interno no tiene ninguna fila que cumpla con los criterios
-A diferencia del bucle anidado que podría ser impulsado desde cualquiera de las tablas, esta es una unión unidireccional
a =b(+) siempre irá a a antes de b, esto puede resultar en un plan más costoso (posiblemente fuera de NL)
(+) siempre irá al lado deficiente

También lee
Hash Join
Método de unión en Oracle
https://en.wikipedia.org/wiki/Nested_loop_join