Planes de SQL Server: diferencia entre Index Scan / Index Seek


87

En un plan de ejecución de SQL Server, ¿cuál es la diferencia entre una exploración de índice y una búsqueda de índice?

Estoy en SQL Server 2005.

Respuestas:


128

Un escaneo de índice es donde el servidor SQL lee todo el índice en busca de coincidencias; el tiempo que toma es proporcional al tamaño del índice.

Una búsqueda de índice es donde el servidor SQL utiliza la estructura de árbol b del índice para buscar directamente los registros coincidentes (consulte http://mattfleming.com/node/192 para obtener una idea de cómo funciona); el tiempo que se toma es solo proporcional a el número de registros coincidentes.

  • En general, una búsqueda de índice es preferible a una exploración de índice (cuando el número de registros coincidentes es proporcionalmente mucho menor que el número total de registros), ya que el tiempo necesario para realizar una búsqueda de índice es constante independientemente del número total de registros en su mesa.
  • Sin embargo, tenga en cuenta que, en determinadas situaciones, una exploración de índice puede ser más rápida que una búsqueda de índice (a veces significativamente más rápida), normalmente cuando la tabla es muy pequeña o cuando un gran porcentaje de los registros coinciden con el predicado.

3
¿Sigue activo el enlace? para mi no funciona. Por favor ayude si hay un enlace actualizado
Ronak Agrawal

2
@RonakAgrawal Parece que el enlace de hecho está muerto, ¿tal vez verifique wikipedia en su lugar?
Justin


76

La regla básica a seguir es que los escaneos son malos, las búsquedas son buenas.

Escaneo de índice

Cuando SQL Server realiza un escaneo, carga el objeto que desea leer del disco en la memoria, luego lee ese objeto de arriba a abajo en busca de los registros que necesita.

Búsqueda de índice

Cuando SQL Server hace una búsqueda, sabe en qué parte del índice estarán los datos, por lo que carga el índice desde el disco, va directamente a la parte del índice que necesita y lee hasta donde terminan los datos que necesita. . Obviamente, esta es una operación mucho más eficiente que un escaneo, ya que SQL ya sabe dónde se encuentran los datos que está buscando.


¿Cómo puedo modificar un plan de ejecución para usar una búsqueda en lugar de una exploración?

Cuando SQL Server está buscando sus datos, probablemente una de las cosas más importantes que harán que SQL Server cambie de una búsqueda a una exploración es cuando algunas de las columnas que está buscando no están incluidas en el índice que desea utilizar. La mayoría de las veces, esto hará que SQL Server vuelva a realizar un análisis de índice agrupado, ya que el índice agrupado contiene todas las columnas de la tabla. Esta es una de las principales razones (al menos en mi opinión) por las que ahora tenemos la capacidad de INCLUIR columnas en un índice, sin agregar esas columnas a las columnas indexadas del índice. Al incluir las columnas adicionales en el índice, aumentamos el tamaño del índice, pero permitimos que SQL Server lea el índice, sin tener que volver al índice agrupado ni a la tabla para obtener estos valores.

Referencias

Para obtener información sobre los detalles de cada uno de estos operadores dentro de un plan de ejecución de SQL Server, consulte ....


7

Respuesta corta:

  • Escaneo de índice: toque todas las filas excepto ciertas columnas.

  • Búsqueda de índice: toque determinadas filas y determinadas columnas.


4

Con un escaneo de índice, todas las filas del índice se escanean para encontrar una fila coincidente. Esto puede resultar eficaz para mesas pequeñas. Con una búsqueda de índice, solo necesita tocar las filas que realmente cumplen con los criterios y, por lo tanto, generalmente tiene un mejor rendimiento.


2

Una exploración de índice ocurre cuando la definición de índice no puede encontrar en una sola fila para satisfacer los predicados de búsqueda. En este caso, SQL Server tiene que escanear varias páginas para encontrar un rango de filas que satisfaga los predicados de búsqueda.

En el caso de una búsqueda de índice, SQL Server encuentra una única fila que coincida con los predicados de búsqueda utilizando la definición de índice .

Las búsquedas de índice son mejores y más efectivas.


0

Un escaneo toca todas las filas de la tabla, incluso si es lo que busca o no

Una búsqueda mira solo las filas que son lo que está buscando.

Siempre es mejor tener búsquedas que escaneos, ya que son más eficientes en la forma en que busca datos.

Puede encontrar una buena explicación aquí.


3
Las búsquedas no siempre son mejores, por ejemplo, si la tabla es relativamente pequeña y es necesario devolver un gran porcentaje de las filas de esa tabla, un escaneo de índice puede terminar siendo mucho más eficiente.
Justin

1
Hola Justin, supongo que quieres decir que los escaneos de mesa algunas veces pueden ser mejores. Indexes Seek siempre es mejor que un Index Scan a menos que estemos hablando de agrupados. Pero, a veces, un escaneo de tabla o un escaneo de índice agrupado pueden ser más eficientes por la razón que mencionaste. En lugar de buscar el índice y obtener los campos que no están en el índice de la tabla, a veces, ms sql usará la tabla incluso si el índice tiene el campo de criterios.
Jose Areas
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.