Ska jag skapa ett icke-klusterat index på alla sökbara kolumner eller bara varje kolumn separat?
On februari 15, 2021 by adminJag är inte säker på att jag ska använda icke-grupperade index korrekt. SSMS-planuppskattaren sa att man skulle lägga till ett annat index när följande index redan fanns 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 fråga var
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
Min fråga är … ska jag skapa ett index för alla möjliga uppslagstangenter? Jag söker efter mzone, iso och post i olika frågor.
Tack
Kommentarer
- Tar du med varje kolumn från tabellen?
- Ja, jag inkluderar alla kolumner.
- Att inkludera alla kolumner i ett enda index kommer inte att hjälpa så mycket – ett sådant index först och främst fördubblar utrymmeskraven, och för det andra kan den bara någonsin användas för de n längst till vänster – det gör INTE bara magiskt snabbare att söka efter den 17: e kolumnen i din tabell.
- separat index för varje kolumn – bara för att du kanske söker efter det någon dag – är inte heller bra. Ett index kostar dig – när det gäller prestanda vid varje infogning, uppdatering, radering. Don ' t overindex – att ' är nästan värre än att ha inga index alls ….
- Tack för de kommentarerna @marc_s, det är precis den information jag letade efter. Är det också lämpligt att säga att det finns ett stort antal icke-klustrade index att ha (till exempel mellan 5-10) eller är det rent relativt i förhållande till tabellens behov? I så fall, vilken typ av saker är det i förhållande till?
Svar
SQL Server visar dig ett index den skulle vilja använda, eftersom den uppskattar att index skulle göra livet enklare. Det finns verkligen inget behov av att skapa ett index på alla sökbara fält, i själva verket gör skrivprestandan betydligt sämre. Om du har mindre än säg 5 till 10 index i den angivna tabellen och du kör den frågan hela tiden vill du antagligen lägga till det föreslagna indexet exakt som SSMS visar det.
JNK” s Redigera nedan
Det är också viktigt att titta på de föreslagna indexen tillsammans. Förslagen är alla i silor så att säga, så ett helt föreslaget index kan ersättas genom att lägga till ett INCULDE
d-fält i ett annat index.
Till exempel, det är möjligt att ha förslag på dessa två index:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
När du faktiskt skulle kunna tillgodose behoven hos båda med:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Jag har sett detta med mycket mer komplicerade index (10-20 nyckelfält, 10-20 inkluderade fält) där man lägger till ett fält till INCLUDE
-listan eliminerar behovet av det andra indexet.
Kommentarer
- @MaxVernon: läs Stairway to SQL Server Indexing – Part 1, Introduction to Indexes och sedan resten av artiklarna i serien – täcker i stort sett allt om SQL Server-index, från introduktion till avancerade ämnen
- @MaxVernon: eller se Täckande index med inkluderade kolumner för en diskussion om inkluderade kolumner för att göra e ett index " som täcker "
Svar
Anledningen till att du säger att du ska skapa ett nytt index är att det du har inte är det mest optimala. Frågaoptimeraren är ganska selektiv på det sätt som den väljer vilket index som ska användas, följande länk ska hjälpa dig att förstå selektivitet:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
Du sa ovan att du har inkluderat alla kolumner i indexet – i huvudsak duplicering av tabelldata. På grundval av detta, vad skulle skada att skapa tre separata index på de kolumner du nämner? Det använda utrymmet skulle vara mindre och hastigheten skulle vara mycket snabbare. Jag skulle riskera att gissa att detta är vad DTA / exekveringsplanen säger – bara på ett annat sätt.
Titta på detaljerna i körplanen som genereras av frågan för att identifiera var dina flaskhalsar är och använd det som en riktlinje för hur du utformar dina index. SQL Server är ganska bra på att veta vad som är bäst – lita på vad det säger dig.
Jag hoppas att det hjälper dig.
Lämna ett svar