Mam trudności ze stwierdzeniem, dlaczego dodanie indeksu do klucza obcego tabeli spowalnia widok mojego kolegi. Ten widok składa się z kilku spakowanych widoków z łączeniem zewnętrznym i łączeniem wewnętrznym. Próbowałem usunąć je jeden po drugim, aby dowiedzieć się, gdzie jest problem, ale nie mogę powiedzieć, że nie pochodzi on z określonego widoku, ale z nich wszystkich.W jaki sposób indeks spowalnia działanie instrukcji select?
Wiedziałem, że indeksy mogą spowolnić wstawianie lub że pobierają rozmiar na dysku twardym, ale nigdy nie czytałem nigdzie, że mogą być odpowiedzialne za spowolnienie widoku. Prawda jest taka:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
GO
select top 20 * from MyView
Zajmuje 20 sekund z indeksem i 9 bez.
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]
Czy spojrzałeś na plan kwerend, aby zobaczyć, co się dzieje? –
Teoretycznie indeks sprawia, że optymalizator rozważa więcej opcji podczas budowania planu, który, jeśli zdecyduje, że potrzebuje skanowania tabeli, może spowolnić działanie. Wątpię jednak, czy kiedykolwiek miałby wymierny efekt. Czy możesz opublikować zapytanie, którego dotyczy problem? – JohnFx
Czy powiedziałeś, że widok jest widokiem, który wywołuje widoki (lub czy źle zinterpretowałem)? Musisz to natychmiast zatrzymać, jeśli tak. Te widoki muszą w pełni zmaterializować wszystkie niższe widoki do działania i są bardzo powolne, gdy występują duże ilości danych. Jest antysemisją SQL, aby mieć widok wywołania innych widoków. – HLGEM