2011-09-09 9 views
5

Sto riscontrando un momento piuttosto difficile nel trovare perché l'aggiunta di un indice sulla chiave esterna di un tavolo sta rallentando la vista del mio collega. Questa vista è composta da diverse viste impaccate con join esterno e inner join. Ho provato a rimuoverli uno ad uno per capire dove fosse il problema, ma non posso dire che non sembra provenire da una vista particolare ma da tutti.Come può un indice rallentare un'istruzione select?

Sapevo che gli indici potevano rallentare l'inserimento o che stavano prendendo le dimensioni sul disco rigido, ma non ho mai letto da nessuna parte che potrebbero essere responsabili del rallentamento di una vista. La verità è quando lo faccio:

DBCC FREEPROCCACHE 
DBCC DROPCLEANBUFFERS 
GO 

select top 20 * from MyView 

Ci vogliono 20 secondi con l'indice e 9 senza.

CREATE NONCLUSTERED INDEX [IX_MyField] ON [dbo].MyTable 
(
    [MyField] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
    IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
    ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
+1

Hai guardato il queryplan per vedere cosa sta succedendo? –

+0

In teoria, l'indice fa in modo che l'ottimizzatore consideri più opzioni durante la creazione del piano, che se decidesse di richiedere comunque una scansione della tabella potrebbe rallentarlo. Tuttavia, dubito che avrebbe mai avuto un effetto misurabile. Puoi pubblicare la query che è interessata? – JohnFx

+0

Hai detto che la vista è una vista che chiama viste (o ho interpretato male)? Devi smetterla subito, se è così. Questi punti di vista devono concretizzare pienamente tutte le viste inferiori per funzionare e sono estremamente lente quando ci sono grandi quantità di dati coinvolti. È un antipattern SQL per avere la vista chiama altre viste. – HLGEM

risposta

9

È possibile che i tuoi altri indici o statistiche non siano aggiornati. Se non sono attuali, è possibile che l'analizzatore di query stia scegliendo un piano di esecuzione non ottimale utilizzando il nuovo indice poiché ritiene che sia più veloce.

prova ad eseguire:

UPDATE STATISTICS WITH (FULLSCAN)

sulla vostra tavola.

+1

Quel tizio delle rocce! Hai salvato la mia settimana! – Arthis

+1

Felice di aiutare e felice ha funzionato. Problemi come questo sono un problema da affrontare molte volte. – JNK

2

Stai selezionando altre colonne da MyTable? Se è così, probabilmente stai facendo una ricerca segnalibro (o ricerca RID), il che significa che stai tornando al tuo tavolo per i dati aggiuntivi.

È necessario posizionare qualsiasi colonna che si seleziona ulteriormente nella clausola INCLUDE dell'indice.

Eseguire entrambe le query con piani di esecuzione abilitati e confrontare il 2, identificando quali parti della query impiegano più tempo.

+0

Grazie per la tua spiegazione, non ha risolto il mio problema ma mi ha aiutato a capire un po 'di più come funzionano gli indici. Buona giornata! – Arthis

Problemi correlati