Ta dyskusja toczy brakuje na ważną kwestię: Nie chodzi o to, czy „non-key-kolumny” są lepiej to jak indeksu -columns lub zawarte -columns.
Pytanie brzmi, jak drogo można użyć mechanizmu włączania, aby uwzględnić kolumny, które są niezbyt potrzebne w indeksie? (zwykle nie jest częścią klauzul where, ale często jest częścią selects). Więc zawsze jest dylemat:
- użycie indeksu na ID1, ID2 ... IDN sam lub
- użycie indeksu na ID1, ID2 ... IDN Plus obejmują col1, col2 ... Cöln
Gdzie: ID1, ID2 ... IDN są często stosowane w kolumnach ograniczeń i col1, col2 ... Cöln kolumny są często wybrane, ale zazwyczaj nie używane w ograniczeniach
(Opcja włączenia wszystkich tych kolumn jako części klucza indeksu jest po prostu zawsze niemądra (chyba że są one również używane w ograniczeniach) - ponieważ zawsze będzie droższa w utrzymaniu, ponieważ indeks musi być aktualizowany i sortowany nawet gdy "klucze" się nie zmieniły).
Więc użyj opcji 1 lub 2?
Odpowiedź: Jeśli twoja tabela jest rzadko aktualizowana - w większości wstawiana do/usuwana z - wtedy stosunkowo tanie jest używanie mechanizmu włączania, aby zawrzeć niektóre "gorące kolumny" (które są często używane w wybranych - ale nie często używane na ograniczeniach), ponieważ wstawianie/usuwanie wymaga, aby indeks był aktualizowany/sortowany w każdym razie, a zatem niewielki dodatkowy narzut związany jest z przechowywaniem kilku dodatkowych kolumn podczas aktualizacji indeksu. Narzut to dodatkowa pamięć i procesor używany do przechowywania nadmiarowych informacji w indeksie.
Jeśli kolumny rozważyć dodanie jako ujęte-kolumny są często aktualizowane (bez indeksowanych kluczowe -columns aktualizowany) - lub - jeśli jest ich tak wiele, że indeks będzie blisko kopię twojego stołu - skorzystaj z opcji 1, proponuję! Również jeśli dodamy pewną kolumnę (y) włączające, aby nie spowodować różnicy w wydajności - możesz pominąć pomysł dodania ich :) Sprawdź, czy są przydatne!
Średnia liczba wierszy na te same wartości w kluczach (id1, id2 ... idN) również może mieć znaczenie.
Należy zauważyć, że jeśli kolumna - która jest dodawana jako zawarte -column wskaźnika - służy do ograniczenia : Dopóki indeksu jako takie mogą być stosowane (na ograniczenia z indeksowanych key -columns) - wówczas SQL Server dopasowuje ograniczenie kolumny do indeksu (wartości węzła-liścia), zamiast iść drogim sposobem wokół samej tabeli.
Czyli to byłaby technika tworzenia tańszej wersji indeksu objętego ubezpieczeniem? – JMarsch
@ gbn, mógłbyś wyjaśnić to zdanie bardziej szczegółowo i wyjaśnić, dlaczego oznacza to, że klauzula include nie jest przydatna do sortowania, itp: "Klauzula INCLUDE dodaje dane na najniższym poziomie/liście zamiast w indeksie Drzewo to powoduje, że indeks jest mniejszy, ponieważ nie jest częścią drzewa " –
@JMarsch: przepraszam za późną odpowiedź, ale tak, to jest dokładnie to, co jest. – gbn