2009-05-04 24 views
17

Estoy en el proceso de tratar de optimizar una consulta que busca datos históricos. Estoy usando el analizador de consultas para buscar el plan de ejecución y he descubierto que la mayor parte del costo de mi consulta se basa en algo llamado "búsqueda de marcador". Nunca antes había visto este nodo en un plan de ejecución y no sé lo que significa.¿Qué es una búsqueda de marcadores en el servidor Sql?

¿Es esto algo bueno o malo en una consulta?

Respuesta

28

Una búsqueda de marcador es el proceso de búsqueda de los datos reales en la tabla SQL, en función de una entrada encontrada en un índice no agrupado.

Cuando busca un valor en un índice no agrupado y su consulta necesita más campos que los que forman parte del nodo hoja índice (todos los campos de índice, más cualquier columna INCLUDE posible), entonces SQL Server debe ir recupera la (s) página (s) de datos real - eso es lo que se llama una búsqueda de marcador.

En algunos casos, ese es realmente el único camino a seguir, solo si su consulta requerirá solo un campo más (no un montón de ellos), podría ser una buena idea INCLUIR ese campo en el no- índice agrupado. En ese caso, el nodo de hoja del índice no agrupado contendría todos los campos necesarios para satisfacer su consulta (un índice de "cobertura") y, por lo tanto, ya no sería necesaria una búsqueda de marcador.

Marc

+2

De acuerdo. Si se devuelve un gran porcentaje de la tabla, puede ser mejor simplemente escanear la tabla, pero si las estadísticas son deficientes, puede obtener un plan que haga las búsquedas de marcadores en su lugar. Hay un ebook gratis bastante decente sobre los planes de ejecución en redgate - http://www.red-gate.com/specials/Grant.htm – ahains

+1

Sí, el sitio de Red Gate tenía muchas cosas buenas de SQL Server disponibles, muchas de ellas para gratis, también! –

3

Es un NESTED LOOP que une un índice no agrupado con la propia mesa en un puntero de fila.

sucede para las consultas de este tipo:

SELECT col1 
FROM table 
WHERE col2 BETWEEN 1 AND 10 

, si usted tiene un índice en col2.

El índice en col2 contiene punteros a las filas indexadas.

Por lo tanto, con el fin de recuperar el valor de col1, el motor tiene que escanear el índice en col2 de los valores clave de 1-10, y para cada hoja de índice, consulte la tabla en sí usando el puntero contenida en el hoja, para averiguar el valor de col1.

This article señala que una Bookmark Lookup es 'término s, que se sustituye por NESTED LOOP' SQL Server 2000 s entre el índice y la tabla en SQL Server 2005 y por encima de

+0

CLUSTERED KEY LOOKUP es la búsqueda de marcador, AFAIK. –

+0

Puede ser un poco confuso referirse a él como un NESTED LOOP, realmente no está relacionado con el tipo de unión NESTED LOOP ¿no? ¿Supongo que solo estás hablando conceptualmente? – ahains

+0

Cada registro en una tabla tiene un puntero físico que se puede usar para acceder a este registro. Un índice no agrupado es de hecho otra tabla. Cuando crea una tabla SELECT * FROM WHERE col1 ENTRE a AND b, de hecho, hay una unión oculta: SELECT * FROM col1_index JOIN table ON table.rowid = col1_index WHERE col1_index.col1 ENTRE a AND b. Esta unión puede ser NESTED LOOP e incluso HASH (cuando dos índices se unen). – Quassnoi

2

De MSDN respecto Bookmark Lookups:

El El operador de búsqueda de marcadores usa un marcador (ID de fila o clave de agrupación) en , busque la fila correspondiente en la tabla o en el índice agrupado. La columna Argumento contiene la etiqueta de marcador que se utiliza para buscar la fila en la tabla o índice agrupado. La columna Argumento también contiene el nombre de la tabla o índice agrupado en el que se busca la fila .Si la cláusula CON PREFETCH aparece en la columna de la discusión, el procesador de consultas ha determinado que es óptimo utilizar asíncrono la obtención previa cuando se mira hacia arriba marcadores en la mesa o en clúster índice (lectura anticipada).

Cuestiones relacionadas