Moet ik een niet-geclusterde index maken voor alle doorzoekbare kolommen of alleen voor elke kolom afzonderlijk?
Geplaatst op februari 15, 2021 door adminIk weet niet zeker of ik niet-geclusterde indexen correct moet gebruiken. De SSMS-plan schatter zei dat er nog een index moest worden toegevoegd als de volgende index al op tafel stond.
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] )
Mijn vraag was
SELECT * FROM tbl_shipping_rates_zones WHERE postal = "10001"
Mijn vraag is … moet ik een index maken voor alle mogelijke opzoeksleutels? Ik zoek op mzone, iso en post in verschillende zoekopdrachten.
Bedankt
Reacties
- Neemt u elke kolom van de tabel?
- Ja, ik neem elke kolom op.
- Het zal niet veel helpen om alle kolommen in een enkele index op te nemen – zon index verdubbelt in de eerste plaats in feite de ruimtevereisten, en ten tweede kan het alleen gebruikt worden voor de n meest linkse kolommen – het NIET maakt het zoeken naar de 17e kolom in je tabel op magische wijze sneller.
- En het hebben van een een aparte index voor elke kolom – alleen omdat je er op een dag misschien naar zoekt – is ook niet erg goed. Een index kost u wel – in termen van prestaties bij elke invoeging, update, verwijdering. Don ' t overindex – dat ' is bijna slechter dan helemaal geen indexen …
- Bedankt voor die opmerkingen @marc_s, dat is precies de informatie die ik zocht. Is het ook gepast om te zeggen dat er een goede reeks niet-geclusterde indexen beschikbaar is (bijvoorbeeld tussen 5-10) of is het puur gerelateerd aan de behoeften van de tabel? Zo ja, wat voor soort dingen is het gerelateerd aan?
Answer
SQL Server toont u een index het zou willen gebruiken, omdat het schat dat die index het leven gemakkelijker zou maken. Het is zeker niet nodig om voor elk doorzoekbaar veld een index te maken, in feite zal dit de schrijfprestaties aanzienlijk slechter maken. Als u minder dan bijvoorbeeld 5 tot 10 indexen in de gegeven tabel heeft en u voert die zoekopdracht de hele tijd uit, dan wilt u waarschijnlijk de voorgestelde index precies zo toevoegen zoals SSMS deze laat zien.
JNK” s Bewerken hieronder
Het is ook belangrijk om samen naar de voorgestelde indexen te kijken. De suggesties zijn allemaal in silos, om zo te zeggen, dus een volledige voorgestelde index zou kunnen worden vervangen door een INCULDE
d veld toe te voegen aan een andere index.
Bijvoorbeeld, het is mogelijk om suggesties te hebben voor deze twee indexen:
CREATE INDEX ix_IndexA ON Table (ColA, ColB) CREATE INDEX ix_IndexB ON Table (ColA) INCLUDE (ColC)
Terwijl je in feite aan de behoeften van beide zou kunnen voldoen met:
CREATE INDEX ix_IndexC ON Table (ColA, ColB) INCLUDE (ColC)
Ik “heb dit gezien met veel gecompliceerdere indexen (10-20 sleutelvelden, 10-20 velden inbegrepen) waarbij één veld werd toegevoegd aan de INCLUDE
lijst elimineert de noodzaak voor de tweede index.
Reacties
- @MaxVernon: read Stairway to SQL Server Indexing – Deel 1, Inleiding tot indexen en vervolgens de rest van de artikelen in de serie – behandelt vrijwel alles over SQL Server-indexen, van intro tot geavanceerde onderwerpen
- @MaxVernon: of zie Covering Index met inbegrepen kolommen voor een bespreking van opgenomen kolommen om te maken e een index " die "
Antwoord
De reden waarom het u vertelt om een nieuwe index te maken, is omdat degene die u heeft niet de meest optimale is die mogelijk is. Het query-optimalisatieprogramma is vrij selectief in de manier waarop het kiest welke index moet worden gebruikt. De volgende link zou u moeten helpen de selectiviteit te begrijpen:
http://blogs.msdn.com/b/bartd/archive/2011/01/25/query_5f00_tuning_5f00_key_5f00_terms.aspx
U zei hierboven dat u alle kolommen in de index heeft opgenomen – in feite dupliceert u de tabelgegevens. Wat zou op basis hiervan de schade zijn van het maken van 3 afzonderlijke indexen voor de kolommen die u noemt? De gebruikte ruimte zou minder zijn en de snelheid zou veel hoger zijn. Ik durf te vermoeden dat dit is wat het DTA / uitvoeringsplan u vertelt – alleen op een andere manier.
Bekijk de details van het uitvoeringsplan die door de query worden gegenereerd om te bepalen waar uw knelpunten zijn en gebruik die als richtlijn voor het ontwerpen van uw indexen. SQL Server weet redelijk goed wat het beste is – vertrouw op wat het u vertelt.
Ik hoop dat dit u helpt.
Geef een reactie