Esta publicación es la segunda parte de una serie sobre operadores de unión física, asegúrese de revisar:
El Nested Loops es uno de los cuatro operadores a cargo de combinar datos y generar un flujo de salida.
El operador Nested Loops es, con mucho, el algoritmo más simple, echemos un vistazo a su apariencia visual.
¿Cómo leer el plan de arriba?
Cada persona tiene su propia forma de leer los planes de ejecución, pero generalmente tenemos que leer los planes de ejecución de derecha a izquierda, siguiendo las flechas de flujo de datos. Por lo tanto, en la imagen de arriba vemos dos flechas de flujos de datos que pasan datos al Nested Loops, la flecha que está en la parte superior se llama Outer Input, la que está en la parte inferior se llama Inner Input, luego a la izquierda de el operador Nested Loops vemos la salida final (los datos combinados).
¿Cómo funciona?
La lógica es muy simple de entender, ya que es como tener dos cursores anidados, el cursor principal son los datos de la entrada externa (Outer Input) y el cursor anidado son los datos de la entrada interna (Inner Input). Entonces, tome el primer valor de la entrada externa (Outer Input) y compárelo con cada valor de la entrada interna (cursor anidado), una vez que se complete el primer bucle, tome el siguiente valor de la entrada externa (Outer Input) y compárelo con cada valor de la entrada interna (Inner Input). en. Por favor ver más abajo.
¿Los bucles anidados pueden hacer Seek?
De hecho, hay varias optimizaciones que permiten que el operador Nested Loops busque directamente las filas, por ejemplo (pero sin limitarse a):
Cluster Index
Nonclustered Index
Spool
¿Te preguntas cómo funciona esto? Por favor ver más abajo.
SQL Server aún tiene que recorrer la entrada externa (Outer Input) una fila a la vez, pero ya no lo hace en la entrada interna (Inner Input), sin embargo, la búsqueda se ejecutó cuatro veces (para cada fila en la entrada externa "Inner Input")
Consideraciones.
Si la entrada externa es pequeña (cardinalidad baja) y la entrada interna tiene un bajo costo, entonces el operador Nested Loops será muy eficiente.
Los índices correctos permiten buscar a través de la entrada interna.
En circunstancias normales, el operador Nested Loops no es un operador que cause bloqueo.
Por último, pero no menos importante, quiero aclarar que el propósito principal de este post es explicar de la manera más simple posible la forma en que el operador Nested Loops funciona, esta es la razón por la que no cubrí otras cosas interesante( Dynamic vs Static Inner inputs, Prefetching, Rebind and Rewinds, etc).
¡Diviértanse aprendiendo!