Di recente ci siamo imbattuti nel problema del punto di non ritorno e alcune delle nostre query sui rapporti utilizzate per completare l'esecuzione entro un paio di secondi ora impiegano più di 2 minuti perché l'ottimizzatore delle query semplicemente ignora l'indice non cluster nella colonna di ricerca. Una query di esempio di seguito:
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
colonna è indice cluster e Throwtime
ha indice non cluster. In questo caso, abbiamo notato che viene utilizzato l'ordinamento throwtime
anziché le ID
modifiche del piano di query e dell'indice non cluster. Stiamo anche pianificando di archiviare alcuni dei vecchi dati (attualmente ha 20 milioni di righe !!). Tuttavia, apportare queste modifiche all'applicazione richiederà del tempo e devo trovare un modo per eseguire i report in modo ragionevolmente veloce, senza apportare modifiche a livello di applicazione (vabbè, questa è la vita!).
Inserisci la guida del piano. Ho creato la guida di piano di seguito con un suggerimento per la query dell'indice non cluster e per qualche motivo, l'indice non cluster non è ancora utilizzato. Mi sto perdendo qualcosa?
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'
in throwtime >= '20140320 07:00' AND throwtime < '20140324 07:00';
- per favore vedi questo post sul blog e anche questo .