Bør jeg lage en ikke-gruppert indeks på alle søkbare kolonner eller bare hver kolonne separat?
On februar 15, 2021 by adminJeg er ikke sikker på at jeg skal bruke ikke-grupperte indekser. SSMS-planestimatoren sa å legge til en ny 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] )
Spørsmålet mitt var
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
Spørsmålet mitt er … skal jeg lage en indeks for alle mulige oppslagstaster? Jeg søker etter mzone, iso og post i forskjellige spørsmål.
Takk
Kommentarer
- Tar du med hver kolonne fra tabellen?
- Ja, jeg inkluderer hver kolonne.
- Å inkludere alle kolonnene i en enkelt indeks vil ikke hjelpe mye – en slik indeks dobler i utgangspunktet plassbehovet, og for det andre kan den bare brukes til de n kolonnene til venstre – det gjør IKKE bare magisk å søke etter den 17. kolonnen i tabellen raskere.
- Og å ha en separat indeks for hver kolonne – bare fordi du kanskje søker etter den en dag – er heller ikke veldig bra. En indeks koster deg – når det gjelder ytelse på hver innsats, oppdatering, sletting. Ikke ' t overindeks – at ' er nesten verre enn å ikke ha noen indekser i det hele tatt ….
- Takk for kommentarene @marc_s, det er akkurat den informasjonen jeg lette etter. Er det også hensiktsmessig å si at det er et godt utvalg av ikke-klyngede indekser å ha (mellom 5-10 for eksempel), eller er det rent relativt til tabellens behov? Hvis ja, hva slags ting er det i forhold til?
Svar
SQL Server viser deg en indeks den vil bruke, siden den anslår at indeksen vil gjøre livet lettere. Det er absolutt ikke behov for å lage en indeks på hvert søkbart felt, faktisk vil det gjøre skriveytelsen vesentlig dårligere. Hvis du har mindre enn si 5 til 10 indekser på den gitte tabellen, og du kjører spørringen hele tiden, vil du sannsynligvis legge til den foreslåtte indeksen nøyaktig slik SSMS viser den.
JNK» s Edit Below
Det er også viktig å se på de foreslåtte indeksene sammen. Forslagene er så å si alle i siloer, slik at en hel foreslått indeks kan erstattes ved å legge til et INCULDE
d-felt i en annen indeks.
For eksempel, det er mulig å ha forslag til disse to indeksene:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Når du faktisk kan imøtekomme behovene til begge med:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Jeg har sett dette med mye mer kompliserte indekser (10-20 nøkkelfelt, 10-20 inkluderte felt) hvor du legger til ett felt til INCLUDE
-listen vil eliminere behovet for den andre indeksen.
Kommentarer
- @MaxVernon: les Stairway to SQL Server Indexing – Part 1, Introduction to Indexes og deretter resten av artiklene i serien – dekker stort sett alt om SQL Server-indekser, fra intro til avanserte emner
- @MaxVernon: eller se Dekningsindeks ved hjelp av inkluderte kolonner for en diskusjon om inkluderte kolonner for å lage e en indeks " som dekker "
Svar
Årsaken til at du forteller deg at du skal opprette en ny indeks, er fordi den du har ikke er den mest optimale. Søkeoptimalisereren er ganske selektiv på den måten den velger hvilken indeks du vil bruke, følgende lenke skal hjelpe deg med å forstå selektivitet:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Du sa ovenfor at du har tatt med alle kolonnene i indeksen – i det vesentlige dupliserte tabelldataene. På dette grunnlaget, hva ville være skadene ved å lage 3 separate indekser på kolonnene du nevner? Plassen som brukes ville være mindre og hastigheten ville være mye raskere. Jeg vil risikere å gjette at dette er hva DTA / utførelsesplanen forteller deg – bare på en annen måte.
Se på detaljene i kjøringsplanen som genereres av spørringen, for å identifisere hvor flaskehalsene dine er, og bruk den som en retningslinje for hvordan du designer indeksene dine. SQL Server er ganske flink til å vite hva som er best – stol på det den forteller deg.
Jeg håper dette hjelper deg.
Legg igjen en kommentar