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 ID
columna es Índice agrupado y Throwtime
tiene índice no agrupado. En este caso, notamos que ordenando en throwtime
lugar de ID
cambios 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
fuente
throwtime between '3/20/2014 7:00:00 AM' and '3/24/2014 6:59:59 AM'
athrowtime >= '20140320 07:00' AND throwtime < '20140324 07:00';
- vea esta publicación de blog y también esta .Respuestas:
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.
fuente
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.
fuente