none
Problema con un Key Lookup ? RRS feed

  • Pregunta

  • Tengo un plan de ejecución donde el 22% es un Key Lookup y no se como enfrentarlo, esta consumiendo demasiado segun su experiencia ? Dicho Key esta usando el indice Clustered de la tabla 


    DBA SQL Server Santiago/Chile

    jueves, 18 de agosto de 2016 20:36

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

    jueves, 18 de agosto de 2016 22:11
  • 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.
    jueves, 18 de agosto de 2016 22:19
  • 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

    jueves, 18 de agosto de 2016 23:28
  • 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

    viernes, 19 de agosto de 2016 9:58
    Moderador

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

    jueves, 18 de agosto de 2016 22:11
  • 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

    jueves, 18 de agosto de 2016 22:16
  • 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.
    jueves, 18 de agosto de 2016 22:19
  • 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

    jueves, 18 de agosto de 2016 23:28
  • 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

    viernes, 19 de agosto de 2016 9:58
    Moderador