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]
Hai guardato il queryplan per vedere cosa sta succedendo? –
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
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