Comprendiendo un plan de ejecución: tipos de lectura de datos
Cuando se realiza una lectura de datos sobre una base de datos, el motor de bases de datos determina el mejor plan de ejecución (el mejor camino para ejecutar la consulta) y esta lectura puede ser de varios tipos dependiendo de la estructura de la tabla, índices, estadísticas y la cantidad de datos esperados. Existen al menos tres que son las más importantes:
- Table scan.
- Index scan.
- Index seek.
Cada una de estas lecturas es diferentes, aunque el resultado final sea el mismo; algunas ocupan más recursos, algunas ocupan índices, etc. Para saber cuál tipo de lectura se ejecuta se puede leer el plan de ejecución y comprender entonces por qué una consulta es lenta, o simplemente para tratar de hacerla más eficiente.
Table scan
Es el método de lectura más sencillo ya que realiza una lectura de toda la tabla para encontrar y extraer lo que se está buscando. Se realiza principalmente bajo las siguientes condiciones
- La consulta no puede hacer uso de algún índice, por que no hay alguno que le sea útil.
- Se requieren muchos campos de la tabla (puede ser por un SELECT * FROM…).
- Se extraerá la mayoría de los registros de las tablas.
De las formas de lectura de datos esta es la más costosa (en tiempo y recursos) ya que, para obtener lo solictado, se debe hacer un barrido secuencial de todos y cada uno de los registros, sin embargo, en ocasiones es la única manera de obtener el resultado, o bien, el uso de las otras dos técnias resulta más costosa por que son búsquedas en tablas demasiado pequeñas para sacar ventaja del uso de índices.
Index scan
En este método, la lectura se hace primero sobre un índice, no sobre la tabla, para obtener los registros que se requieren, es decir, ya se aprovecha un índice pero se hace una lectura secuencial sobre el índice. Esta técnica es más rápida que la primera (y por lo tanto es más rápida y ocupa menos recursos)
Index seek
De los tres métodos de lectura de datos, el Index seek es el más eficiente y rápido, ya que aprovecha un índice dentro de la tabla para «saltar» a los registros que requiere. Es muy eficiente cuando el query busca pocos registros y se pueden ubicar estos registros con un índice. Si el motor de base de datos determina que no es útil utilizar este tipo de lectura (por que regresaría muchos registros por ejemplo) utilizará otro método, aunque exista un índice que nos parezca idóneo para el query.