Perché la mia guida al piano non viene utilizzata?


9

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 IDcolonna è indice cluster e Throwtimeha indice non cluster. In questo caso, abbiamo notato che viene utilizzato l'ordinamento throwtimeanziché le IDmodifiche 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

Come appare l'indice non cluster? Il motivo per cui il server lo ignora è perché non pensa che farà nulla di buono. O hai un piano difettoso o un indice difettoso
Allan S. Hansen,

3
A parte, PER FAVORE, PER FAVORE, cambia 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 .
Aaron Bertrand

@AaronBertrand Grazie mille. Sì, ho suggerito anche quel cambiamento e lo faranno nella prossima versione.
RK Kuppala,

Risposte:


11

La query deve corrispondere ESATTAMENTE, incluso lo spazio bianco. Ti suggerisco di ottenere la query dalla cache e crearla da quella anziché inserirla in altro modo.


0

LEGGI DI NUOVO IL TUO ARTICOLO COLLEGATO

Scrivere una guida di piano per forzare l'uso del tuo indice non è quasi certamente quello che vuoi, in quanto forzerà ricerche di segnalibri inefficienti. Secondo il tuo articolo, la soluzione corretta per la prestazione più efficiente di questa query sarebbe quella di modificare il tuo indice in modo che sia un indice non cluster coprente , in altre parole, o aggiungi tutte le colonne dalla tua tabella all'indice o (preferibilmente ) basta aggiungere le colonne necessarie per questa query, quindi modificare la selezione per estrarre solo quelle colonne.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.