Principales respuestas
Problema con un Key Lookup ?

Pregunta
-
Respuestas
-
Hola.
En general, debes evitar este tipo de comportamientos. Si el SQL Server no te indica que crees un "covering index" mediante una sugerencia, trata de ubicar un campo o varios campos requeridos por la consulta y que no están en el índice.
Creo que si aplicas el Tuning Wizard, espero que así se llame, éste te recomendará algunas cosas para evitar este comportamiento, de acuerdo con la carga que le proporciones. Hace bastante tiempo yo lo hacía con una traza de SQL Profiler; no se si ahora será el mejor modo...
¿Qué versión de SQL Server estás trabajando? Es que tengo un artículo del 2010 sobre este tema y es para SQL Server 2008...
Saludos,
Guillermo Taylor F.
MVP Data Platform & IT Pro
Mi Blog- Marcado como respuesta Miguel Egea GómezMVP, Moderator viernes, 25 de noviembre de 2016 10:32
-
Lo que comenta Guillemos es correcto, basicamente tienes un no clustered index que inicia para buscar pero necesita informacion que no esta en el y si es un cluster index por lo tanto para satisface su necesidad hace una key lookup, tambien fijate que el predicado no te diga que esta usando conversiones implicitas pues to tambien puede afectar.
- Marcado como respuesta Miguel Egea GómezMVP, Moderator viernes, 25 de noviembre de 2016 10:32
-
Hola.
El artículo es How To Eliminate Key Lookups in SQL Server 2008.
Otro interesante, y con buen nivel de detalle y ejemplos, es Using Covering Indexes to Improve Query Performance.
Intenta y nos cuentas como te va en SQL Server 2012.
Saludos,
Guillermo Taylor F.
MVP Data Platform & IT Pro
Mi Blog- Marcado como respuesta Miguel Egea GómezMVP, Moderator viernes, 25 de noviembre de 2016 10:32
-
lo que te está haciendo viene a decir que con las estadísticas actuales el join ideal es hacer un key lookup, lo que quiere decir que por cada fila que entre, hará esa búsqueda, no es necesariamente malo, si entran pocas filas.
El tema es que probablemente esté estimando mal las filas si al final entran demasiadas. Además de las recomendaciones de los compañeros de hacer un covered index, puedes intentar actualizar las estadísticas por si el plan de ejecución cambiara. También puedes intentar ver que pasaría forzando con hints que en lugar de un key lookup se haga un hash (o un merge si puedes conseguir que las dos entradas estén ordenadas por la cláusula join)
https://msdn.microsoft.com/en-us/library/ms173815.aspx?f=255&MSPPError=-2147217396
Espero que te sirva.
Comparte lo que sepas, aprende lo que no sepas (FGG)
portalSQL
El rincón del DBA- Marcado como respuesta Miguel Egea GómezMVP, Moderator viernes, 25 de noviembre de 2016 10:32
Todas las respuestas
-
Hola.
En general, debes evitar este tipo de comportamientos. Si el SQL Server no te indica que crees un "covering index" mediante una sugerencia, trata de ubicar un campo o varios campos requeridos por la consulta y que no están en el índice.
Creo que si aplicas el Tuning Wizard, espero que así se llame, éste te recomendará algunas cosas para evitar este comportamiento, de acuerdo con la carga que le proporciones. Hace bastante tiempo yo lo hacía con una traza de SQL Profiler; no se si ahora será el mejor modo...
¿Qué versión de SQL Server estás trabajando? Es que tengo un artículo del 2010 sobre este tema y es para SQL Server 2008...
Saludos,
Guillermo Taylor F.
MVP Data Platform & IT Pro
Mi Blog- Marcado como respuesta Miguel Egea GómezMVP, Moderator viernes, 25 de noviembre de 2016 10:32
-
Estoy trabajando sobre SQL 2012, pero me serviria mucho el del SQL 2008.
Nota. busque en los join todos los campos usados por la tabla que hace el lookup y cree un idnice nuevo y sigue usando el cluster, pero mañana lo miro con mas calma.
DBA SQL Server Santiago/Chile
-
Lo que comenta Guillemos es correcto, basicamente tienes un no clustered index que inicia para buscar pero necesita informacion que no esta en el y si es un cluster index por lo tanto para satisface su necesidad hace una key lookup, tambien fijate que el predicado no te diga que esta usando conversiones implicitas pues to tambien puede afectar.
- Marcado como respuesta Miguel Egea GómezMVP, Moderator viernes, 25 de noviembre de 2016 10:32
-
Hola.
El artículo es How To Eliminate Key Lookups in SQL Server 2008.
Otro interesante, y con buen nivel de detalle y ejemplos, es Using Covering Indexes to Improve Query Performance.
Intenta y nos cuentas como te va en SQL Server 2012.
Saludos,
Guillermo Taylor F.
MVP Data Platform & IT Pro
Mi Blog- Marcado como respuesta Miguel Egea GómezMVP, Moderator viernes, 25 de noviembre de 2016 10:32
-
lo que te está haciendo viene a decir que con las estadísticas actuales el join ideal es hacer un key lookup, lo que quiere decir que por cada fila que entre, hará esa búsqueda, no es necesariamente malo, si entran pocas filas.
El tema es que probablemente esté estimando mal las filas si al final entran demasiadas. Además de las recomendaciones de los compañeros de hacer un covered index, puedes intentar actualizar las estadísticas por si el plan de ejecución cambiara. También puedes intentar ver que pasaría forzando con hints que en lugar de un key lookup se haga un hash (o un merge si puedes conseguir que las dos entradas estén ordenadas por la cláusula join)
https://msdn.microsoft.com/en-us/library/ms173815.aspx?f=255&MSPPError=-2147217396
Espero que te sirva.
Comparte lo que sepas, aprende lo que no sepas (FGG)
portalSQL
El rincón del DBA- Marcado como respuesta Miguel Egea GómezMVP, Moderator viernes, 25 de noviembre de 2016 10:32