¿Por qué no se usa mi guía de plan?

9

Recientemente nos encontramos con el problema del punto de inflexión y algunas de nuestras consultas de informes que solían completar la ejecución en un par de segundos ahora demoran más de 2 minutos porque el optimizador de consultas simplemente ignora el índice no agrupado en la columna de búsqueda. Una consulta de ejemplo a continuación:

select top 100 *
from   [dbo].[t_Call]
where  ID > 0 
  and  throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
order by id

La IDcolumna es Índice agrupado y Throwtimetiene índice no agrupado. En este caso, notamos que ordenando en throwtimelugar de IDcambios se usa el plan de consulta y el índice no agrupado. También estamos planeando archivar algunos de los datos antiguos (¡actualmente tiene 20 millones de filas!). Pero realizar estos cambios en la aplicación llevará algún tiempo y necesito encontrar una manera de hacer que los informes se ejecuten razonablemente rápido, sin hacer cambios a nivel de aplicación (¡bueno, así es la vida!).

Ingrese la guía del plan. Creé la siguiente guía de plan con una sugerencia de consulta de índice no agrupado y, por alguna razón, el índice no agrupado todavía no se utiliza. ¿Me estoy perdiendo de algo?

EXEC sp_create_plan_guide 
@name = N'[prod2reports_callthrowtime]', 
@stmt = N'select top 100 *
          from   [dbo] . [t_Call]
          where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID',
@type = N'SQL', 
@module_or_batch = N'select top 100 *
                     from   [dbo] . [t_Call]
                     where  ID > @0 and @1 < = ThrowTime and ThrowTime < = @2 order by ID', 
@params = N'@0 int, @1 datetime, @2 datetime', 
@hints = N'OPTION (TABLE HINT( [dbo] . [t_Call],
                   INDEX(IDX_NC_t_call_ThrowtimeProblemCodes)))'
GO
RK Kuppala
fuente
¿Cómo se ve el índice no agrupado? La razón por la que el servidor lo ignora es porque no cree que sirva de nada. O tienes un plan defectuoso o un índice defectuoso
Allan S. Hansen
3
Por otro lado, POR FAVOR, POR FAVOR cambie throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'a throwtime >= '20140320 07:00' AND throwtime < '20140324 07:00';- vea esta publicación de blog y también esta .
Aaron Bertrand
@AaronBertrand Muchas gracias. Sí, sugerí ese cambio también y lo harán en la próxima versión.
RK Kuppala

Respuestas:

11

La consulta debe coincidir EXACTAMENTE, incluido el espacio en blanco. Le sugiero que obtenga la consulta del caché y la cree a partir de eso en lugar de ingresarla de otra manera.

Rob Farley
fuente
0

LEA DE NUEVO SU ARTÍCULO VINCULADO

Escribir una guía de plan para forzar el uso de su índice casi seguro no es lo que desea, ya que forzará búsquedas de marcadores ineficientes. Según su artículo, la solución correcta para el rendimiento más eficiente de esta consulta sería alterar su índice para que sea un índice de cobertura no agrupado, en otras palabras, agregar todas las columnas de su tabla al índice o (preferiblemente ) solo agregue las columnas que necesita para esta consulta y luego modifique la selección para extraer esas columnas.

Jason
fuente