Skal jeg oprette et ikke-grupperet indeks på alle søgbare kolonner eller bare hver kolonne separat?
On februar 15, 2021 by adminJeg er ikke sikker på, at jeg korrekt bruger ikke-klyngede indekser. SSMS-planestimatoren sagde at tilføje et andet indeks, når følgende indeks allerede var på bordet.
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] )
Min forespørgsel var
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
Mit spørgsmål er … skal jeg oprette et indeks for alle mulige opslagstaster? Jeg søger efter mzone, iso og post i forskellige forespørgsler.
Tak
Kommentarer
- Omfatter du hver kolonne fra tabellen?
- Ja, jeg inkluderer hver kolonne.
- At medtage alle kolonner i et enkelt indeks vil ikke hjælpe meget – sådan et indeks fordobler først og fremmest grundlæggende pladsbehovet, og for det andet kan det kun nogensinde bruges til de n kolonner, der er til venstre – det gør IKKE bare magisk hurtigere at søge efter den 17. kolonne i din tabel.
- Og have en separat indeks for hver kolonne – bare fordi du måske søger efter det en dag – er heller ikke særlig godt. Et indeks koster dig – med hensyn til performance på hver indsats, opdatering, sletning. Don ' t overindex – at ' er næsten værre end slet ingen indeks ….
- Tak for disse kommentarer @marc_s, det er netop den information, jeg ledte efter. Er det også hensigtsmæssigt at sige, at der er et godt udvalg af ikke-klyngede indekser at have (for eksempel mellem 5-10), eller er det udelukkende relativt til bordets behov? Hvis ja, hvilken slags ting er det i forhold til?
Svar
SQL Server viser dig et indeks det vil gerne bruge, da det estimerer, at indekset vil gøre livet lettere. Der er bestemt ikke behov for at oprette et indeks på alle søgbare felter, og det vil faktisk gøre skriveydelsen væsentligt dårligere. Hvis du har mindre end sige 5 til 10 indekser i den givne tabel, og du kører denne forespørgsel hele tiden, vil du sandsynligvis tilføje det foreslåede indeks nøjagtigt som SSMS viser det.
JNK” s Rediger nedenfor
Det er også vigtigt at se på de foreslåede indekser sammen. Forslagene er så at sige alle i siloer, så et helt foreslået indeks kunne erstattes ved at tilføje et INCULDE
d-felt på et andet indeks.
For eksempel, det er muligt at have forslag til disse to indekser:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Når du faktisk kunne imødekomme begge behov med:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Jeg har set dette med meget mere komplicerede indekser (10-20 nøglefelter, 10-20 inkluderede felter) hvor der tilføjes et felt til INCLUDE
-listen fjerner behovet for det andet indeks.
Kommentarer
- @MaxVernon: læs Trappe til SQL Server-indeksering – Del 1, Introduktion til indekser og derefter resten af artiklerne i serien – dækker stort set alt om SQL Server-indekser, fra introduktion til avancerede emner
- @MaxVernon: eller se Dækningsindeks ved hjælp af inkluderede kolonner for en diskussion af inkluderede kolonner, der skal laves e et indeks " der dækker "
Svar
Årsagen til, at det fortæller dig, at du skal oprette et nyt indeks, er, at det, du har, ikke er den mest optimale. Forespørgselsoptimeringsværktøjet er ret selektivt på den måde, det vælger, hvilket indeks der skal bruges, følgende link skal hjælpe dig med at forstå selektivitet:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Du sagde ovenfor, at du har inkluderet alle kolonner i indekset – i det væsentlige duplikere tabeldataene. På dette grundlag, hvad ville skade være ved at oprette 3 separate indekser på de kolonner, du nævner? Den anvendte plads ville være mindre, og hastigheden ville være meget hurtigere. Jeg risikerer at gætte på, at dette er hvad DTA / udførelsesplanen fortæller dig – bare på en anden måde.
Se på detaljerne i udførelsesplanen, der genereres af forespørgslen, for at identificere, hvor din flaskehals er, og brug det som en retningslinje for, hvordan du designer dine indekser. SQL Server er ret god til at vide, hvad der er bedst – tillid til, hvad det fortæller dig.
Jeg håber, det hjælper dig.
Skriv et svar