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
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 .