Esta sección explica las operaciones más comunes del plan de ejecución en la base de datos SQL Server. Se puede también echar un vistazo a la documentación de Microsoft.
Acceso a tabla y índice
SQL Server tiene una terminología sencilla: las operaciones “Scan” leen el índice o la tabla entera mientras las operaciones “Seek” usan el B-tree o la dirección física (RID
, como ROWID
en Oracle) para tener acceso a una parte especifica del índice o de la tabla.
- Index Seek, Clustered Index Seek
Index Seek
realiza un recorrido del B-tree y lee los nodos hoja para encontrar todas las entradas que coinciden. Ver también “Anatomía de un índice SQL”.- Index Scan, Clustered Index Scan
Lee el índice entero (todas las filas) en el orden del índice. Dependiendo de varias estadísticas del sistema, la base de datos podría realizar esta operación si se necesitan todas las filas en el orden del índice, por ejemplo, debido a la cláusula del
order by
.- Key Lookup (Clustered)
Recupera una sola fila desde una agrupación de índice. Es similar a la operación de Oracle
INDEX UNIQUE SCAN
por una tabla organizada según índice (IOT). Ver también “Agrupación de datos: El segundo poder de la indexación”.- RID Lookup (Heap)
Recupera una sola fila desde una tabla, como la operación de Oracle
TABLE ACCESS BY INDEX ROWID
. Ver también “Anatomía de un índice SQL”.- Table Scan
Es también conocido como un escaneo entero de la tabla. Lee la tabla entera (todas las filas y las columnas) tal y como se almacenan sobre el disco. Aunque las operaciones de lectura de multi-bloques pueden mejorar la velocidad de
Table Scan
, es todavía una de las operaciones más costosas. Además de la tasa alta de I/O,Table Scan
debe también leer todas las filas de la tabla así que también se puede consumir una grande cantidad de tiempo CPU. Ver también “FULL TABLE SCAN”.
Operaciones de unión (join)
Por lo general, las operaciones de unión procesan sólo dos tablas a la vez. En el caso de que la sentencia tenga que unir más tablas, las operaciones se ejecutan de forma secuencial: primero las dos tablas y después el resultado intermedio con la siguiente tabla. En el contexto de las uniones, el término “tabla” también puede hacer referencia a “resultado intermedio”.
- Nested Loops
Unir dos tablas es buscar el resultado desde una tabla y después seleccionar la otra tabla por cada fila de la primera. SQL Server también utiliza la operación “nested loops” para recuperar datos de la tabla después de tener un acceso al índice. Ver también “Nested loops”.
- Hash Match
La coincidencia hash de la unión carga los registros candidatos de un lado de la unión dentro de la tabla hash y después se comparan cada fila con el otro lado de la unión. Ver también “Hash join”.
- Merge Join
Merge join combina dos listas ordenadas como la cremallera de un pantalón. Ambos lados de la unión deben ser ordenados. Ver también “Sort merge”.
Ordenar y agrupar
- Sort
Ordenar el resultado de acuerdo con la cláusula
order by
. Esta operación necesita una gran cantidad de memoria para materializar el resultado intermedio (sin pipeline). Ver también “Indexar Order By”.- Sort (Top N Sort)
Ordena un subconjunto del resultado de acuerdo con la cláusula
order by
. Se usa para las sentencias top-N si la ejecución en pipeline no es posible. Ver también “Seleccionar registros Top-N”.- Stream Aggregate
Agrega un conjunto preordenado de acuerdo con la cláusula
group by
. Esta operación no pone en memoria el resultado intermedio, se ejecuta de forma pipeline. Ver también “Indexar Group By”.- Hash Match (Aggregate)
Agrupa el resultado usando una tabla hash. Esta operación necesita gran cantidad de memoria para materializar el resultado intermedio (sin pipeline). De cualquier forma, la salida no está ordenada. Ver también “Indexar Group By”.
Sentencias Top-N
- Top
Aborta las operaciones subyacentes cuando se alcanza el número de filas deseado. Ver también “Seleccionar registros Top-N”.
La eficiencia de la sentencia top-N depende del modo de ejecución de las operaciones subyacentes. Es muy ineficiente cuando se aborta operaciones sin pipeline como
Sort
.