I tak wkracza sztuka strategii dostrajania wydajności i indeksowania ...
Logiczne wydaje mi się poprawienie istniejącej definicji indeksu w celu uwzględnienia sugerowanych kolumn
Wezmę twój cytat i napiszę trzecią definicję indeksu:
create index [idx_index3]
on [table1] (col1, col2, col3)
include (col4, col5, col6....);
To powinno być CREATE INDEX
stwierdzenie, które odpowiada cytowanemu oświadczeniu.
To może być rozsądne rozwiązanie, ale to zależy . Oto kilka przykładów, kiedy mówię, że to zależy.
Jeśli masz wspólne obciążenie, które składa się głównie z takich zapytań:
select col1, col2, col3
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
Wtedy twój idx_index1
indeks byłby solidny. Idealnie wąski, jest to indeks, który spełnia to zapytanie bez żadnych obcych danych (nie biorąc pod uwagę definicji indeksu klastrowego, jeśli w ogóle).
Ale jeśli masz obciążenie, które składa się głównie z zapytań:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2;
Wtedy idx_index2
byłoby mądre, ponieważ jest to, co nazywa się pokrywającą indeks zapobiegając potrzebę kluczowego przeglądowej powrót do indeksu klastrowego (lub RID lookup plecami do sterty). Ta definicja indeksu nieklastrowego obejmowałaby wyłącznie wszystkie dane, których potrzebuje zapytanie.
Z twoim zaleceniem byłoby dobrze pasować do zapytania takiego jak:
select co11, col2, col3, col4, col5
from table1
where col1 = 1
and col2 = 2
and col3 = 3;
Twoje idx_index3
zalecenie byłoby indeksem obejmującym, który spełnia kryteria wyszukiwania dla powyższego zapytania.
Chodzi mi o to, że chodzi o pojedyncze pytanie, na które nie możemy ostatecznie odpowiedzieć. Wszystko zależy od typowego i częstego obciążenia pracą. Oczywiście zawsze możesz zdefiniować wszystkie trzy z tych indeksów, aby obsłużyć każdy przykładowy typ zapytania, ale wtedy pojawia się pytanie o konserwację, która będzie wymagana do aktualizacji tych indeksów (pomyśl: INSERTs, UPDATEs, DELETEs). To narzut indeksów.
Musisz dokładnie przeanalizować i ocenić obciążenie pracą oraz ustalić, gdzie będą najlepsze korzyści. Jeśli pierwsze przykładowe zapytanie jest najczęściej wykonywane dziesiątki razy na sekundę, a istnieje bardzo rzadkie zapytanie, takie jak trzecie przykładowe zapytanie, wówczas nie ma sensu przesadzać stron poziomu indeksu za pomocą INCLUDE
niekluczowe kolumny. Wszystko zależy od obciążenia pracą.
Jeśli rozumiesz ostrożne strategie indeksowania i rozumiesz swoje wspólne obciążenie pracą, wówczas stosując oba te sposoby będziesz w stanie wymyślić najlepszą możliwą drogę.