2011-09-09 15 views
5

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] 
+1

Czy spojrzałeś na plan kwerend, aby zobaczyć, co się dzieje? –

+0

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

+0

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

Odpowiedz

9

Możliwe jest, że Twoje INNE indeksy lub statystyki są nieaktualne. Jeśli nie są aktualne, możliwe, że analizator zapytań wybiera nieoptymalny plan wykonania przy użyciu nowego indeksu, ponieważ uważa, że ​​będzie on szybszy.

spróbuj uruchomić:

UPDATE STATISTICS WITH (FULLSCAN)

na stole.

+1

To jest koleś! Uratowałeś mój tydzień! – Arthis

+1

Chętnie pomogę i cieszę się, że zadziałało. Takie problemy to ból, który trzeba przepracować wiele razy. – JNK

2

Czy wybierasz inne kolumny z MyTable? Jeśli tak, prawdopodobnie wykonujesz wyszukiwanie zakładek (lub RID Lookup), co oznacza, że ​​powrócisz do swojej tabeli, aby uzyskać dodatkowe dane.

Powinieneś umieścić dowolne kolumny, które dodatkowo wybierzesz w klauzuli INCLUDE indeksu.

Uruchom oba zapytania z włączonymi planami wykonawczymi i porównaj 2, określając, które fragmenty zapytania trwają dłużej.

+0

Dziękuję za wyjaśnienia, to nie rozwiązało mojego problemu, ale pomógł mi lepiej zrozumieć działanie indeksów. Miłego dnia! – Arthis

Powiązane problemy