Czy powinienem utworzyć indeks nieklastrowy dla wszystkich kolumn z możliwością wyszukiwania, czy tylko dla każdej kolumny osobno?
On 15 lutego, 2021 by adminNie jestem pewien, czy poprawnie używać indeksów nieklastrowych. Estymator planu SSMS powiedział, że dodaje kolejny indeks, gdy następujący indeks był już w tabeli.
CREATE NONCLUSTERED INDEX [ix_zone_fetch_shipping] ON [dbo].[tbl_shipping_rates_zones] ( [iso] ASC, [mzone] ASC, [postal] ASC ) INCLUDE ( [region], [zone_dom], [zone_emi], [zone_pmi], [zone_fci], [zone_ups], [zone_fed] )
Moje zapytanie to
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
Moje pytanie brzmi … czy powinienem utworzyć indeks dla wszystkich możliwych kluczy wyszukiwania? Wyszukuję według mzone, iso i pocztowego w różnych zapytaniach.
Dzięki
Komentarze
- Czy uwzględniasz każdą kolumnę z tabeli?
- Tak, uwzględniam każdą kolumnę.
- Uwzględnienie wszystkich kolumn w jednym indeksie niewiele pomoże – taki indeks przede wszystkim podwaja wymagania dotyczące miejsca, a po drugie, może być używane tylko dla n skrajnych lewej kolumny – NIE tylko magicznie przyspiesza wyszukiwanie 17. kolumny w tabeli.
- I mając oddzielny indeks dla każdej kolumny – tylko dlatego, że pewnego dnia możesz go wyszukać – również nie jest zbyt dobry. Indeks kosztuje – jeśli chodzi o wydajność przy każdej wkładce, aktualizacji, usunięciu. Nie ' t overindex – to ' jest prawie gorsze niż brak indeksów w ogóle ….
- Dziękuję za komentarze @marc_s, to jest dokładnie ta informacja, której szukałem. Ponadto, czy należy powiedzieć, że istnieje duży zakres indeksów nieklastrowych (na przykład od 5 do 10), czy też jest to wyłącznie związane z potrzebami tabeli? Jeśli tak, do jakiego rodzaju rzeczy jest to odniesione?
Odpowiedź
SQL Server pokaże indeks chciałby użyć, ponieważ szacuje, że indeks ułatwiłby życie. Z pewnością nie ma potrzeby tworzenia indeksu dla każdego pola, które można przeszukiwać, w rzeczywistości znacznie pogorszy to wydajność zapisu. Jeśli masz mniej niż powiedzmy 5 do 10 indeksów w podanej tabeli i wykonujesz to zapytanie przez cały czas, prawdopodobnie chcesz dodać sugerowany indeks dokładnie tak, jak pokazuje go SSMS.
JNK” s Edytuj poniżej
Ważne jest również, aby spojrzeć razem na sugerowane indeksy. Wszystkie sugestie są, że tak powiem, w silosach, więc jeden cały sugerowany indeks można zastąpić, dodając pole INCULDE
d do innego indeksu.
Na przykład można mieć sugestie dotyczące tych dwóch indeksów:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Kiedy w rzeczywistości możesz zaspokoić potrzeby obu z:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Widziałem to w przypadku znacznie bardziej skomplikowanych indeksów (10–20 pól kluczowych, 10–20 pól uwzględnionych), gdzie dodawanie jednego pola do INCLUDE
eliminuje potrzebę drugiego indeksu.
Komentarze
- @MaxVernon: read Stairway to SQL Server Indexing – Part 1, Introduction to Indexes , a następnie pozostałe artykuły z tej serii – obejmuje prawie wszystko o indeksach SQL Server, od wprowadzenia do zaawansowanych tematów
- @MaxVernon: lub zobacz Indeks obejmujący przy użyciu Uwzględnionych kolumn , aby omówić uwzględnione kolumny do wykonania e indeks " obejmujący "
Odpowiedź
Mówi ci o utworzeniu nowego indeksu, ponieważ ten, który masz, nie jest najbardziej optymalnym z możliwych. Optymalizator zapytań jest dość selektywny pod względem wyboru indeksu, którego należy użyć, poniższy link powinien pomóc w zrozumieniu selektywności:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Powiedziałeś powyżej, że zawarłeś wszystkie kolumny w indeksie – zasadniczo powielając dane tabeli. Na tej podstawie, jaka byłaby szkoda w utworzeniu 3 oddzielnych indeksów we wspomnianych kolumnach? Wykorzystana przestrzeń byłaby mniejsza, a prędkość znacznie większa. Zaryzykowałbym przypuszczenie, że to właśnie mówi ci DTA / plan wykonania – tylko w inny sposób.
Przyjrzyj się szczegółom planu wykonania, które są generowane przez zapytanie, aby określić, gdzie są twoje wąskie gardła i wykorzystaj je jako wytyczne dotyczące projektowania indeksów. SQL Server całkiem dobrze wie, co jest najlepsze – ufaj temu, co ci mówi.
Mam nadzieję, że to ci pomoże.
Dodaj komentarz