Menu

Index Scan vs. Table Scan

Julio 8, 2013 - SQL Server

Hace mucho que no escribía una entrada para SQL Server, y en hace rato quería ver cuáles eran las diferencias entre un Table Scan y un Index Scan, dos técnicas que utiliza el Query Optimizer para ejecutar las consultas que le enviamos al motor de base de datos, primero veamos un poco de teoría.

Lo primero que debemos aclarar es que un Scan es lo inverso a un Seek, es decir, mientras que una operación Seek utiliza un índice para buscar exactamente aquellos que cumplen con nuestra condición un Scan revisa todos los registros de la tabla.

Index Scan

La documentación de MSDN nos dice:

El operador Clustered Index Scan examina el índice clúster especificado en la columna Argument del plan de ejecución de consulta. Si hay un predicado WHERE:(), sólo se devuelven las filas que lo cumplen. Si la columna Argument contiene la cláusula ORDERED, el procesador de consultas ha solicitado que la salida de las filas se devuelva en el orden en que las haya ordenado el índice clúster. Si no hay una cláusula ORDERED, el motor de almacenamiento recorre el índice de la forma óptima (sin tener que ordenar el resultado).

Clustered Index Scan es un operador lógico y físico.

Icono del operador Examen de índice clúster Icono de plan de ejecución gráfico

en otras palabras nos dice que éste tipo de operador se aplica cuando existe un índice clustered (generalmente la llave primaria).

Cuando veamos que se usa este operador en nuestra consulta quiere decir que no se encontro un índice que pudiera ser usado para satisfacer nuestra consulta, por tanto se lee todo EL ÍNDICE para retornar las filas.

Table Scan

La documentación de MSDN nos dice:

El operador Table Scan recupera todas las filas de la tabla especificada en la columna Argument del plan de ejecución de consultas. Si hay un predicado WHERE:() en la columna Argument, sólo se devuelven las filas que cumplan el predicado.

Table Scan es un operador lógico y físico.

Icono del operador Table Scan Icono de plan de ejecución gráfico

Creo que el concepto es muy claro, recupera todas las filas de la tabla. Ahora si pensamos un poco ambos operadores hacen un “barrido” general de las tablas para traer la información, cuál es más eficiente? cuales son sus diferencias?.

Diferencias

Manos a la obra!

Requisitos

Para este ejemplo cree una base de datos con solo dos tabla, cada una de ellas con dos campos idénticos, la diferencia entre estas dos tablas es que una de ellas tiene un índice clustered y la otra no lo tiene, tal como se ve en la imagen:

image

Al ejecutar las consultas en cada una de las tablas vemos cuando el Query Optimizer decide usar Table Scan e Index Scan:

image

Resultados de lectura-escritura:

Table ‘NonClustedredIndexTable’. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Y este es el resultado en la tabla con el Clustered Index

image

Resultados de lectura-escritura:

Table ‘ClustedredIndexTable’. Scan count 1, logical reads 2, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

Conclusión

Escoger bien un plan de ejecución siempre tiene sus triquiñuelas y debemos conocer bien nuestra tabla para escoger el mejor, por lo regular el Query Optimizer tiene la razón pero no siempre escoge los mejores planes, ahí es cuando debemos entrar nosotros en acción!.

Happy coding! Sonrisa

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *