Hem - Mobil enheter
SQL - Index. Index i SQL Server Index på en databastabell är vana vid
Ett av de viktigaste sätten att uppnå hög produktivitet SQL Serverär användningen av index. Ett index påskyndar frågeprocessen genom att ge snabb åtkomst till rader med data i en tabell, ungefär som ett index i en bok hjälper dig att snabbt hitta den information du behöver. I den här artikeln kommer jag att ge en kort översikt över index i SQL Server och förklara hur de är organiserade i databasen och hur de hjälper till att påskynda databasfrågor.

Index skapas på tabell- och vykolumner. Index ger ett sätt att snabbt söka data baserat på värdena i dessa kolumner. Om du till exempel skapar ett index på en primärnyckel och sedan söker efter en rad med data med hjälp av primärnyckelvärdena, SQL Server hittar först indexvärdet och använder sedan indexet för att snabbt hitta hela raden med data. Utan ett index kommer en fullständig genomsökning av alla rader i tabellen att utföras, vilket kan ha en betydande inverkan på prestanda.
Du kan skapa ett index för de flesta kolumner i en tabell eller vy. Undantaget är främst kolumner med datatyper för lagring av stora objekt ( LOBB), Till exempel bild, text eller varchar(max). Du kan också skapa index på kolumner som är utformade för att lagra data i formatet XML, men dessa index är strukturerade något annorlunda än standardindexen och deras övervägande ligger utanför ramen för denna artikel. Dessutom diskuterar inte artikeln kolumnbutik index. Istället fokuserar jag på de index som är vanligast i databaser SQL Server.
Ett index består av en uppsättning sidor, indexnoder, som är organiserade i en trädstruktur - balanserat träd. Denna struktur är hierarkisk till sin natur och börjar med en rotnod överst i hierarkin och lövnoderna, bladen, längst ner, som visas i figuren:


När du frågar en indexerad kolumn startar frågemotorn överst i rotnoden och arbetar sig ner genom de mellanliggande noderna, där varje mellanlager innehåller mer detaljerad information om data. Frågemotorn fortsätter att röra sig genom indexnoderna tills den når bottennivån med indexbladen. Till exempel, om du letar efter värdet 123 i en indexerad kolumn, kommer frågemotorn först att fastställa sidan på den första mellannivån på rotnivån. I det här fallet pekar den första sidan på ett värde från 1 till 100 och den andra från 101 till 200, så sökmotorn kommer åt den andra sidan på denna mellannivå. Därefter kommer du att se att du bör gå till den tredje sidan på nästa mellannivå. Härifrån kommer frågeundersystemet att läsa värdet på själva indexet på en lägre nivå. Indexblad kan innehålla antingen själva tabelldatan eller helt enkelt en pekare till rader med data i tabellen, beroende på typen av index: klustrat index eller icke-klustrat index.

Klustrat index
Ett klustrat index lagrar de faktiska raderna med data i indexets blad. För att återgå till föregående exempel betyder detta att raden med data som är associerad med nyckelvärdet 123 kommer att lagras i själva indexet. En viktig egenskap hos ett klustrat index är att alla värden är sorterade i en specifik ordning, antingen stigande eller fallande. Därför kan en tabell eller vy bara ha ett klustrat index. Dessutom bör det noteras att data i en tabell lagras i sorterad form endast om ett klustrat index har skapats på denna tabell.
En tabell som inte har ett klustrat index kallas en heap.
Icke-klustrade index
Till skillnad från ett klustrat index innehåller bladen i ett icke-klustrat index endast dessa kolumner ( nyckel) som detta index bestäms av, och innehåller även en pekare till rader med riktiga data i tabellen. Detta innebär att subquery-systemet kräver ytterligare en operation för att lokalisera och hämta nödvändig data. Innehållet i datapekaren beror på hur data lagras: klustrad tabell eller heap. Om en pekare pekar på en klustrad tabell pekar den på ett klustrat index som kan användas för att hitta den faktiska datan. Om en pekare hänvisar till en hög pekar den på en specifik dataradidentifierare. Icke-klustrade index kan inte sorteras som klustrade index, men du kan skapa mer än ett icke-klustrade index på en tabell eller vy, upp till 999. Det betyder inte att du ska skapa så många index som möjligt. Index kan antingen förbättra eller försämra systemets prestanda. Förutom att du kan skapa flera icke-klustrade index, kan du även inkludera ytterligare kolumner ( inkluderad kolumn) i sitt index: bladen på indexet kommer att lagra inte bara värdet av de indexerade kolumnerna själva, utan också värdena för dessa icke-indexerade ytterligare kolumner. Detta tillvägagångssätt låter dig kringgå några av de restriktioner som läggs på indexet. Du kan till exempel inkludera en icke-indexerbar kolumn eller kringgå indexlängdsgränsen (900 byte i de flesta fall).

Typer av index

Förutom att vara antingen klustrade eller icke-klustrade, kan indexet vidare konfigureras som ett sammansatt index, ett unikt index eller ett täckande index.
Sammansatt index
Ett sådant index kan innehålla mer än en kolumn. Du kan inkludera upp till 16 kolumner i ett index, men deras totala längd är begränsad till 900 byte. Både klustrade och icke-klustrade index kan vara sammansatta.
Unikt index
Detta index säkerställer att varje värde i den indexerade kolumnen är unikt. Om indexet är sammansatt, gäller unikhet för alla kolumner i indexet, men inte för varje enskild kolumn. Till exempel om du skapar ett unikt index på kolumnerna NAMN Och EFTERNAMN, då måste det fullständiga namnet vara unikt, men dubbletter i för- eller efternamn är möjliga.
Ett unikt index skapas automatiskt när du definierar en kolumnrestriktion: primärnyckel eller unik värderestriktion:
  • Primärnyckel
    När du definierar en primärnyckelrestriktion på en eller flera kolumner då SQL Server skapar automatiskt ett unikt klustrat index om ett klustrat index inte har skapats tidigare (i det här fallet skapas ett unikt icke-klustrat index på primärnyckeln)
  • Värderingars unika
    När du definierar en begränsning för unika värden då SQL Server skapar automatiskt ett unikt icke-klustrat index. Du kan ange att ett unikt klustrat index ska skapas om inget klustrat index ännu har skapats i tabellen
Täckande index
Ett sådant index tillåter en specifik fråga att omedelbart få all nödvändig information från indexets blad utan ytterligare tillgång till själva tabellens poster.

Designa index

Så användbara som index kan vara, måste de utformas noggrant. Eftersom index kan ta upp betydande diskutrymme, vill du inte skapa fler index än nödvändigt. Dessutom uppdateras index automatiskt när själva dataraden uppdateras, vilket kan leda till ytterligare resursoverhead och prestandaförsämring. Vid design av index måste flera överväganden avseende databasen och frågor mot den tas i beaktande.
Databas
Som nämnts tidigare kan index förbättra systemets prestanda eftersom de ger frågemotorn ett snabbt sätt att hitta data. Du bör dock också ta hänsyn till hur ofta du tänker infoga, uppdatera eller radera data. När du ändrar data måste indexen också ändras för att återspegla motsvarande åtgärder på data, vilket avsevärt kan minska systemets prestanda. Tänk på följande riktlinjer när du planerar din indexeringsstrategi:
  • För tabeller som uppdateras ofta, använd så få index som möjligt.
  • Om tabellen innehåller en stor mängd data men ändringarna är små, använd så många index som behövs för att förbättra prestandan för dina frågor. Tänk dock noga efter innan du använder index på små tabeller, eftersom... Det är möjligt att det kan ta längre tid att använda en indexsökning än att bara skanna alla rader.
  • För klustrade index, försök att hålla fälten så korta som möjligt. Det bästa tillvägagångssättet är att använda ett klustrat index på kolumner som har unika värden och inte tillåter NULL. Det är därför en primärnyckel ofta används som ett klustrat index.
  • Det unika hos värdena i en kolumn påverkar indexets prestanda. Generellt gäller att ju fler dubbletter du har i en kolumn, desto sämre presterar indexet. Å andra sidan, ju mer unika värden det finns, desto bättre prestanda för indexet. Använd ett unikt index när det är möjligt.
  • För ett sammansatt index, ta hänsyn till ordningen på kolumnerna i indexet. Kolumner som används i uttryck VAR(Till exempel, WHERE FirstName = "Charlie") måste vara först i indexet. Efterföljande kolumner bör listas baserat på unikheten hos deras värden (kolumner med det högsta antalet unika värden kommer först).
  • Du kan också ange ett index på beräknade kolumner om de uppfyller vissa krav. Till exempel måste uttryck som används för att erhålla värdet på en kolumn vara deterministiska (lämna alltid samma resultat för en given uppsättning indataparametrar).
Databasfrågor
Ett annat övervägande när man utformar index är vilka frågor som körs mot databasen. Som nämnts tidigare måste du överväga hur ofta uppgifterna ändras. Dessutom bör följande principer användas:
  • Försök att infoga eller ändra så många rader som möjligt i en fråga, istället för att göra det i flera enskilda frågor.
  • Skapa ett icke-klustrat index på kolumner som ofta används som söktermer i dina frågor. VAR och anslutningar i ANSLUTA SIG.
  • Överväg att indexera kolumner som används i raduppslagsfrågor för exakta värdematchningar.

Och nu faktiskt:

14 frågor om index i SQL Server som du skämdes över att ställa

Varför kan en tabell inte ha två klustrade index?

Vill du ha ett kort svar? Ett klustrat index är en tabell. När du skapar ett klustrat index i en tabell, sorterar lagringsmotorn alla rader i tabellen i stigande eller fallande ordning, enligt indexdefinitionen. Ett klustrat index är inte en separat enhet som andra index, utan en mekanism för att sortera data i en tabell och underlätta snabb åtkomst till datarader.
Låt oss föreställa oss att du har en tabell som innehåller historiken för försäljningstransaktioner. Försäljningstabellen innehåller information som order-ID, produktposition i beställningen, produktnummer, produktkvantitet, ordernummer och datum, etc. Du skapar ett klustrat index på kolumner OrderID Och LineID, sorterade i stigande ordning som visas nedan T-SQL koda:
SKAPA UNIKT CLUSTERED INDEX ix_oriderid_lineid PÅ dbo.Sales(OrderID, LineID);
När du kör det här skriptet kommer alla rader i tabellen att sorteras fysiskt först efter OrderID-kolumnen och sedan efter LineID, men själva data kommer att finnas kvar i ett enda logiskt block, tabellen. Av denna anledning kan du inte skapa två klustrade index. Det kan bara finnas en tabell med en data och den tabellen kan bara sorteras en gång i en specifik ordning.

Om en klustrad tabell ger många fördelar, varför använda en hög då?

Du har rätt. Klustrade tabeller är fantastiska och de flesta av dina frågor kommer att fungera bättre på tabeller som har ett klustrat index. Men i vissa fall kanske du vill lämna borden i sitt naturliga, orörda tillstånd, d.v.s. i form av en hög, och skapa endast icke-klustrade index för att hålla dina frågor igång.
Högen, som du minns, lagrar data i slumpmässig ordning. Vanligtvis lägger lagringsundersystemet till data till en tabell i den ordning som det infogas, men lagringsundersystemet gillar också att flytta runt rader för effektivare lagring. Som ett resultat har du ingen chans att förutsäga i vilken ordning uppgifterna kommer att lagras.
Om frågemotorn behöver hitta data utan att dra nytta av ett icke-klustrat index, kommer den att göra en fullständig genomsökning av tabellen för att hitta de rader den behöver. På väldigt små bord är detta vanligtvis inget problem, men när högen växer i storlek sjunker prestandan snabbt. Naturligtvis kan ett icke-klustrat index hjälpa till genom att använda en pekare till filen, sidan och raden där nödvändig data lagras - detta är vanligtvis ett mycket bättre alternativ till en tabellskanning. Trots det är det svårt att jämföra fördelarna med ett klustrat index när man överväger frågeprestanda.
Högen kan dock hjälpa till att förbättra prestandan i vissa situationer. Överväg en tabell med många inlägg men få uppdateringar eller borttagningar. Till exempel används en tabell som lagrar en logg i första hand för att infoga värden tills den arkiveras. På högen kommer du inte att se personsökning och datafragmentering som med ett klustrat index eftersom raderna helt enkelt läggs till i slutet av högen. Att dela upp sidor för mycket kan ha en betydande inverkan på prestanda, och inte på ett bra sätt. I allmänhet låter högen dig infoga data relativt smärtfritt och du behöver inte ta itu med de lagrings- och underhållskostnader som du skulle göra med ett klustrat index.
Men brist på uppdatering och radering av data bör inte anses vara den enda anledningen. Sättet att sampla data är också en viktig faktor. Du bör till exempel inte använda en heap om du ofta frågar efter dataintervall eller om de data du frågar ofta behöver sorteras eller grupperas.
Allt detta betyder är att du bara bör överväga att använda högen när du arbetar med mycket små tabeller eller så är all din interaktion med tabellen begränsad till att infoga data och dina frågor är extremt enkla (och du använder icke-klustrade index i alla fall). Annars, håll dig till ett väldesignat klustrade index, som ett som definieras i ett enkelt stigande nyckelfält, som en mycket använd kolumn med IDENTITET.

Hur ändrar jag standardindexfyllningsfaktorn?

Att ändra standardindexfyllningsfaktorn är en sak. Att förstå hur standardförhållandet fungerar är en annan sak. Men först, ta några steg tillbaka. Indexfyllningsfaktorn bestämmer mängden utrymme på sidan för att lagra indexet på bottennivån (bladnivå) innan du börjar fylla en ny sida. Till exempel, om koefficienten är inställd på 90, när indexet växer, kommer det att uppta 90 % av sidan och sedan flyttas till nästa sida.
Som standard är indexfyllningsfaktorvärdet in SQL Serverär 0, vilket är samma som 100. Som ett resultat ärver alla nya index automatiskt den här inställningen om du inte specifikt anger ett värde i din kod som skiljer sig från systemets standardvärde eller ändrar standardbeteendet. Du kan använda SQL Server Management Studio för att justera standardvärdet eller köra en systemlagrad procedur sp_configure. Till exempel följande uppsättning T-SQL kommando ställer in koefficientvärdet till 90 (du måste först växla till läget för avancerade inställningar):
EXEC sp_configure "visa avancerade alternativ", 1; GÅ ÅTERKONFIGURERA; GO EXEC sp_configure "fyllfaktor", 90; GÅ ÅTERKONFIGURERA; GÅ
Efter att ha ändrat indexfyllningsfaktorvärdet måste du starta om tjänsten SQL Server. Du kan nu kontrollera det inställda värdet genom att köra sp_configure utan det angivna andra argumentet:
EXEC sp_configure "fyllfaktor" GO
Detta kommando bör returnera värdet 90. Som ett resultat kommer alla nyskapade index att använda detta värde. Du kan testa detta genom att skapa ett index och fråga efter fyllfaktorvärdet:
ANVÄND AdventureWorks2012; -- din databas GÅ SKAPA INKLUSTERAT INDEX ix_people_lastname ON Person.Person(LastName); GÅ VÄLJ fill_factor FRÅN sys.indexes WHERE object_id = object_id("Person.Person") OCH name="ix_people_lastname";
I det här exemplet skapade vi ett icke-klustrat index på en tabell Person i databasen AdventureWorks 2012. Efter att ha skapat indexet kan vi få fyllningsfaktorvärdet från systemtabellerna sys.indexes. Frågan bör returnera 90.
Men låt oss föreställa oss att vi tog bort indexet och skapade det igen, men nu angav vi ett specifikt fyllningsfaktorvärde:
SKAPA INKLUSTERAT INDEX ix_people_efternamn PÅ Person.Person(Efternamn) MED (fillfactor=80); GÅ VÄLJ fill_factor FRÅN sys.indexes WHERE object_id = object_id("Person.Person") OCH name="ix_people_lastname";
Den här gången har vi lagt till instruktioner MED och alternativ fyllnadsfaktor för vårt indexskapande SKAPA INDEX och angav värdet 80. Operatör VÄLJ returnerar nu motsvarande värde.
Hittills har allt varit ganska okomplicerat. Där du verkligen kan bränna dig i hela processen är när du skapar ett index som använder ett standardkoefficientvärde, förutsatt att du känner till det värdet. Till exempel, någon mixar med serverinställningarna och är så envis att de ställer in indexfyllningsfaktorn till 20. Under tiden fortsätter du att skapa index, förutsatt att standardvärdet är 0. Tyvärr har du inget sätt att ta reda på fyllningen faktor tills så länge du inte skapar ett index och kontrollerar sedan värdet som vi gjorde i våra exempel. Annars måste du vänta till det ögonblick då frågeprestanda sjunker så mycket att du börjar misstänka något.
Ett annat problem du bör vara medveten om är att bygga om index. Som med att skapa ett index kan du ange indexfyllningsfaktorvärdet när du bygger om det. Men till skillnad från skapa index-kommandot använder rebuild inte serverns standardinställningar, trots hur det kan se ut. Ännu mer, om du inte specifikt anger indexfyllningsfaktorvärdet, då SQL Server kommer att använda värdet av den koefficient med vilken detta index existerade före dess omstrukturering. Till exempel följande operation ÄNDRA INDEX bygger om indexet vi just skapade:
ALTER INDEX ix_people_lastname ON Person.Person REBUILD; GÅ VÄLJ fill_factor FRÅN sys.indexes WHERE object_id = object_id("Person.Person") OCH name="ix_people_lastname";
När vi kontrollerar fyllfaktorvärdet får vi ett värde på 80, eftersom det var det vi angav när vi senast skapade indexet. Standardvärdet ignoreras.
Som du kan se är det inte så svårt att ändra indexfyllfaktorvärdet. Det är mycket svårare att veta det aktuella värdet och förstå när det tillämpas. Om du alltid specifikt anger koefficienten när du skapar och bygger om index, så vet du alltid det specifika resultatet. Såvida du inte behöver oroa dig för att se till att någon annan inte förstör serverinställningarna igen, vilket gör att alla index byggs om med en löjligt låg indexfyllningsfaktor.

Är det möjligt att skapa ett klustrat index på en kolumn som innehåller dubbletter?

Ja och nej. Ja, du kan skapa ett klustrat index på en nyckelkolumn som innehåller dubbletter av värden. Nej, värdet på en nyckelkolumn kan inte förbli i ett icke-unikt tillstånd. Låt mig förklara. Om du skapar ett icke-unikt klustrat index på en kolumn, lägger lagringsmotorn till en uniquiifier till dubblettvärdet för att säkerställa unikhet och därför kunna identifiera varje rad i den klustrade tabellen.
Till exempel kan du välja att skapa ett klustrat index på en kolumn som innehåller kunddata Efternamn behålla efternamnet. Kolumnen innehåller värdena Franklin, Hancock, Washington och Smith. Sedan sätter du in värdena Adams, Hancock, Smith och Smith igen. Men värdet på nyckelkolumnen måste vara unikt, så lagringsmotorn kommer att ändra värdet på duplikaten så att de ser ut ungefär så här: Adams, Franklin, Hancock, Hancock1234, Washington, Smith, Smith4567 och Smith5678.
Vid första anblicken verkar detta tillvägagångssätt vara bra, men ett heltalsvärde ökar nyckelns storlek, vilket kan bli ett problem om det finns ett stort antal dubbletter, och dessa värden kommer att bli grunden för ett icke-klustrat index eller ett främmande nyckelreferens. Av dessa skäl bör du alltid försöka skapa unika klustrade index när det är möjligt. Om detta inte är möjligt, försök åtminstone använda kolumner med ett mycket högt unikt värdeinnehåll.

Hur lagras tabellen om ett klustrat index inte har skapats?

SQL Server stöder två typer av tabeller: klustrade tabeller som har ett klustrat index och heaptabeller eller bara heaps. Till skillnad från klustrade tabeller sorteras inte data på högen på något sätt. I huvudsak är detta en hög (hög) med data. Om du lägger till en rad i en sådan tabell kommer lagringsmotorn helt enkelt att lägga till den i slutet av sidan. När sidan är fylld med data läggs den till på en ny sida. I de flesta fall vill du skapa ett klustrat index på en tabell för att dra fördel av sorterbarhet och frågehastighet (försök att föreställa dig att leta upp ett telefonnummer i en osorterad adressbok). Men om du väljer att inte skapa ett klustrat index, kan du fortfarande skapa ett icke-klustrat index på högen. I det här fallet kommer varje indexrad att ha en pekare till en högrad. Indexet inkluderar fil-ID, sidnummer och dataradnummer.

Vilket är förhållandet mellan begränsningar för värdeunikt och en primärnyckel med tabellindex?

En primärnyckel och en unik begränsning säkerställer att värdena i en kolumn är unika. Du kan bara skapa en primärnyckel för en tabell och den kan inte innehålla värden NULL. Du kan skapa flera begränsningar för det unika hos ett värde för en tabell, och var och en av dem kan ha en enda post med NULL.
När du skapar en primärnyckel skapar lagringsmotorn också ett unikt klustrat index om ett klustrat index inte redan har skapats. Du kan dock åsidosätta standardbeteendet och ett icke-klustrat index kommer att skapas. Om ett klustrat index finns när du skapar primärnyckeln, skapas ett unikt icke-klustrat index.
När du skapar en unik begränsning skapar lagringsmotorn ett unikt, icke-klustrat index. Du kan dock ange skapandet av ett unikt klustrat index om det inte har skapats tidigare.
I allmänhet är en unik värderestriktion och ett unikt index samma sak.

Varför kallas klustrade och icke-klustrade index B-tree i SQL Server?

Grundläggande index i SQL Server, klustrade eller icke-klustrade, är fördelade över uppsättningar av sidor som kallas indexnoder. Dessa sidor är organiserade i en specifik hierarki med en trädstruktur som kallas ett balanserat träd. På översta nivån finns rotnoden, längst ner finns bladnoderna, med mellanliggande noder mellan topp- och bottennivån, som visas i figuren:


Rotnoden utgör huvudingångspunkten för frågor som försöker hämta data genom indexet. Med utgångspunkt från denna nod initierar frågemotorn en navigering nedför den hierarkiska strukturen till lämplig bladnod som innehåller data.
Tänk dig till exempel att en begäran har mottagits om att välja rader som innehåller nyckelvärdet 82. Frågeundersystemet börjar arbeta från rotnoden, som refererar till en lämplig mellannod, i vårt fall 1-100. Från den mellanliggande noden 1-100 sker en övergång till nod 51-100, och därifrån till den slutliga noden 76-100. Om detta är ett klustrat index, så innehåller nodbladet data för raden som är associerad med nyckeln lika med 82. Om detta är ett icke-klustrat index, innehåller indexbladet en pekare till den klustrade tabellen eller en specifik rad i högen.

Hur kan ett index till och med förbättra frågeprestanda om du måste gå igenom alla dessa indexnoder?

För det första förbättrar index inte alltid prestandan. För många felaktigt skapade index gör systemet till ett gräv och försämrar frågeprestanda. Det är mer korrekt att säga att om index tillämpas noggrant kan de ge betydande prestandavinster.
Tänk på en enorm bok tillägnad prestandajustering SQL Server(pappersversion, inte elektronisk version). Föreställ dig att du vill hitta information om hur du konfigurerar Resource Governor. Du kan dra fingret sida för sida genom hela boken, eller öppna innehållsförteckningen och ta reda på det exakta sidnumret med den information du letar efter (förutsatt att boken är korrekt indexerad och innehållet har rätt index). Detta kommer säkerligen att spara mycket tid, även om du först måste komma åt en helt annan struktur (indexet) för att få den information du behöver från den primära strukturen (boken).
Som ett bokregister, ett register i SQL Server låter dig köra exakta frågor på den data du behöver istället för att helt skanna all data som finns i en tabell. För små tabeller är en fullständig genomsökning vanligtvis inte ett problem, men stora tabeller tar upp många sidor med data, vilket kan resultera i avsevärd tid för exekvering av frågor om det inte finns ett index som gör det möjligt för frågemotorn att omedelbart få rätt plats för data. Föreställ dig att gå vilse vid en vägkorsning på flera nivåer framför en stor metropol utan karta så förstår du idén.

Om index är så bra, varför inte bara skapa ett på varje kolumn?

Ingen god gärning ska förbli ostraffad. Åtminstone är det fallet med index. Index fungerar förstås utmärkt så länge du kör operatörshämtningsfrågor VÄLJ, men så snart frekventa samtal till operatörer börjar FÖRA IN, UPPDATERING Och RADERA, så landskapet förändras mycket snabbt.
När du initierar en dataförfrågan från operatören VÄLJ, hittar frågemotorn indexet, rör sig genom dess trädstruktur och upptäcker data den letar efter. Vad kan vara enklare? Men saker och ting förändras om du initierar ett förändringsuttalande som UPPDATERING. Ja, för den första delen av uttalandet kan frågemotorn återigen använda indexet för att lokalisera raden som ändras - det är goda nyheter. Och om det finns en enkel förändring av data i en rad som inte påverkar förändringar i nyckelkolumner, så kommer förändringsprocessen att vara helt smärtfri. Men vad händer om ändringen gör att sidorna som innehåller data delas, eller värdet på en nyckelkolumn ändras så att den flyttas till en annan indexnod - detta kommer att resultera i att indexet eventuellt behöver en omorganisation som påverkar alla associerade index och operationer , vilket resulterar i en omfattande nedgång i produktivitet.
Liknande processer inträffar när man ringer en operatör RADERA. Ett index kan hjälpa till att hitta de data som raderas, men att ta bort själva data kan leda till omblandning av sidan. Angående operatören FÖRA IN, huvudfienden till alla index: du börjar lägga till en stor mängd data, vilket leder till förändringar i index och deras omorganisation och alla lider.
Så överväg vilka typer av förfrågningar till din databas när du tänker på vilken typ av index och hur många du ska skapa. Mer betyder inte bättre. Innan du lägger till ett nytt index i en tabell, överväg inte bara kostnaden för de underliggande frågorna, utan också mängden diskutrymme som förbrukas, kostnaden för att underhålla funktionalitet och index, vilket kan leda till en dominoeffekt på andra operationer. Din strategi för indexdesign är en av de viktigaste aspekterna av din implementering och bör inkludera många överväganden, från storleken på indexet, antalet unika värden, till vilken typ av frågor indexet kommer att stödja.

Är det nödvändigt att skapa ett klustrat index på en kolumn med en primärnyckel?

Du kan skapa ett klustrat index på valfri kolumn som uppfyller de villkor som krävs. Det är sant att ett klustrat index och en primärnyckelrestriktion är gjorda för varandra och är en match made in heaven, så förstå det faktum att när du skapar en primärnyckel kommer ett klustrat index att skapas automatiskt om det inte har gjorts skapat tidigare. Du kan dock bestämma dig för att ett klustrat index skulle fungera bättre någon annanstans, och ofta kommer ditt beslut att vara motiverat.
Huvudsyftet med ett klustrat index är att sortera alla rader i din tabell baserat på nyckelkolumnen som angavs när indexet definierades. Detta ger snabb sökning och enkel åtkomst till tabelldata.
En tabells primärnyckel kan vara ett bra val eftersom den unikt identifierar varje rad i tabeller utan att behöva lägga till ytterligare data. I vissa fall kommer det bästa valet att vara en surrogat-primärnyckel, som inte bara är unik, utan också liten i storlek och vars värden ökar sekventiellt, vilket gör icke-klustrade index baserade på detta värde mer effektiva. Frågeoptimeraren gillar också den här kombinationen av ett klustrat index och en primärnyckel eftersom det går snabbare att sammanfoga tabeller än att gå med på ett annat sätt som inte använder en primärnyckel och dess tillhörande klustrade index. Som jag sa, det är en match made in heaven.
Slutligen är det dock värt att notera att när man skapar ett klustrat index finns det flera aspekter att ta hänsyn till: hur många icke-klustrade index som kommer att baseras på det, hur ofta värdet på nyckelindexkolumnen kommer att ändras och hur stort. När värdena i kolumnerna i ett klustrat index ändras eller indexet inte fungerar som förväntat, kan alla andra index i tabellen påverkas. Ett klustrat index bör baseras på den mest beständiga kolumnen vars värden ökar i en specifik ordning men inte ändras på ett slumpmässigt sätt. Indexet måste stödja frågor mot tabellens mest åtkomliga data, så frågorna drar full nytta av det faktum att data är sorterad och tillgänglig vid rotnoderna, indexets blad. Om den primära nyckeln passar detta scenario, använd den. Om inte, välj en annan uppsättning kolumner.

Vad händer om du indexerar en vy, är den fortfarande en vy?

En vy är en virtuell tabell som genererar data från en eller flera tabeller. I huvudsak är det en namngiven fråga som hämtar data från de underliggande tabellerna när du frågar den vyn. Du kan förbättra frågeprestanda genom att skapa ett klustrat index och icke-klustrade index i den här vyn, liknande hur du skapar index i en tabell, men huvudförbehållet är att du först skapar ett klustrat index och sedan kan du skapa ett icke-klustrat.
När en indexerad vy (materialiserad vy) skapas, förblir själva vydefinitionen en separat enhet. Detta är trots allt bara en hårdkodad operatör VÄLJ, lagras i databasen. Men indexet är en helt annan historia. När du skapar ett klustrat eller icke-klustrat index på en leverantör, sparas data fysiskt på disk, precis som ett vanligt index. När data ändras i underliggande tabeller ändras dessutom vyns index automatiskt (det betyder att du kanske vill undvika att indexera vyer för tabeller som ändras ofta). I alla fall förblir vyn en vy - en vy av tabellerna, men en som körs för tillfället, med index som motsvarar den.
Innan du kan skapa ett index på en vy måste den uppfylla flera begränsningar. Till exempel kan en vy bara referera till bastabeller, men inte andra vyer, och dessa tabeller måste finnas i samma databas. Det finns faktiskt många andra begränsningar, så se till att kontrollera dokumentationen för SQL Server för alla smutsiga detaljer.

Varför använda ett täckande index istället för ett sammansatt index?

Låt oss först se till att vi förstår skillnaden mellan de två. Ett sammansatt index är helt enkelt ett vanligt index som innehåller mer än en kolumn. Flera nyckelkolumner kan användas för att säkerställa att varje rad i en tabell är unik, eller så kanske du har flera kolumner för att säkerställa att primärnyckeln är unik, eller så försöker du optimera exekveringen av ofta anropade frågor i flera kolumner. I allmänhet gäller dock att ju fler nyckelkolumner ett index innehåller, desto mindre effektivt blir indexet, vilket innebär att sammansatta index bör användas med omtanke.
Som nämnts kan en fråga ha stor nytta om all nödvändig data omedelbart finns på indexets blad, precis som själva indexet. Detta är inte ett problem för ett klustrat index eftersom all data finns redan där (det är därför det är så viktigt att tänka noga när du skapar ett klustrat index). Men ett icke-klustrat index på blad innehåller bara nyckelkolumner. För att komma åt alla andra data kräver frågeoptimeraren ytterligare steg, vilket kan lägga till betydande omkostnader för att köra dina frågor.
Det är här det täckande indexet kommer till undsättning. När du definierar ett icke-klustrat index kan du ange ytterligare kolumner till dina nyckelkolumner. Låt oss till exempel säga att din applikation ofta frågar efter kolumndata OrderID Och Orderdatum i bordet Försäljning:
VÄLJ OrderID, OrderDate FROM Sales WHERE OrderID = 12345;
Du kan skapa ett sammansatt icke-klustrat index på båda kolumnerna, men OrderDate-kolumnen lägger bara till indexunderhållskostnader utan att fungera som en särskilt användbar nyckelkolumn. Den bästa lösningen skulle vara att skapa ett täckande index på nyckelkolumnen OrderID och dessutom inkluderad kolumn Orderdatum:
SKAPA INKLUSTERAT INDEX ix_orderid ON dbo.Sales(OrderID) INCLUDE (OrderDate);
Detta undviker nackdelarna med att indexera redundanta kolumner samtidigt som man behåller fördelarna med att lagra data i blad när du kör frågor. Den inkluderade kolumnen är inte en del av nyckeln, men data lagras på bladnoden, indexbladet. Detta kan förbättra frågeprestanda utan extra omkostnader. Dessutom är kolumnerna som ingår i det täckande indexet föremål för färre restriktioner än nyckelkolumnerna i indexet.

Spelar antalet dubbletter i en nyckelkolumn någon roll?

När du skapar ett index måste du försöka minska antalet dubbletter i dina nyckelkolumner. Eller mer exakt: försök att hålla upprepningsfrekvensen så låg som möjligt.
Om du arbetar med ett sammansatt index gäller dubbleringen för alla nyckelkolumner som helhet. En enskild kolumn kan innehålla många dubbletter av värden, men det bör finnas minimal upprepning bland alla indexkolumner. Till exempel skapar du ett sammansatt icke-klustrat index på kolumner Förnamn Och Efternamn, du kan ha många John Doe-värden och många Doe-värden, men du vill ha så få John Doe-värden som möjligt, eller helst bara ett John Doe-värde.
Unikhetsförhållandet för en nyckelkolumns värden kallas indexselektivitet. Ju fler unika värden det finns, desto högre selektivitet: ett unikt index har största möjliga selektivitet. Frågemotorn gillar verkligen kolumner med höga selektivitetsvärden, särskilt om dessa kolumner ingår i WHERE-satserna i dina vanligast körda frågor. Ju mer selektivt indexet är, desto snabbare kan frågemotorn minska storleken på den resulterande datamängden. Nackdelen är förstås att kolumner med relativt få unika värden sällan kommer att vara bra kandidater för indexering.

Är det möjligt att skapa ett icke-klustrat index på endast en specifik delmängd av en nyckelkolumns data?

Som standard innehåller ett icke-klustrat index en rad för varje rad i tabellen. Naturligtvis kan du säga samma sak om ett klustrat index, förutsatt att ett sådant index är en tabell. Men när det gäller ett icke-klustrat index är en-till-en-relationen ett viktigt begrepp eftersom, från och med version SQL Server 2008, har du möjlighet att skapa ett filtrerbart index som begränsar raderna som ingår i det. Ett filtrerat index kan förbättra frågeprestanda eftersom... den är mindre i storlek och innehåller filtrerad, mer exakt statistik än alla i tabellform - detta leder till skapandet av förbättrade genomförandeplaner. Ett filtrerat index kräver också mindre lagringsutrymme och lägre underhållskostnader. Indexet uppdateras endast när data som matchar filtret ändras.
Dessutom är ett filtrerbart index lätt att skapa. I operatören SKAPA INDEX du behöver bara ange in VAR filtertillstånd. Till exempel kan du filtrera bort alla rader som innehåller NULL från indexet, som visas i koden:
SKAPA INKLUSTERAT INDEX ix_trackingnumber ON Sales.SalesOrderDetail(CarrierTrackingNumber) WHERE CarrierTrackingNumber INTE ÄR NULL;
Vi kan faktiskt filtrera bort all data som inte är viktig i kritiska frågor. Men var försiktig, för... SQL Server inför flera begränsningar för filtrerbara index, till exempel oförmågan att skapa ett filtrerbart index på en vy, så läs dokumentationen noggrant.
Det kan också vara så att du kan uppnå liknande resultat genom att skapa en indexerad vy. Ett filtrerat index har dock flera fördelar, såsom möjligheten att minska underhållskostnaderna och förbättra kvaliteten på dina genomförandeplaner. Filtrerade index kan också byggas om online. Prova detta med en indexerad vy.

Och återigen lite från översättaren

Syftet med uppkomsten av denna översättning på Habrahabrs sidor var att berätta eller påminna dig om SimpleTalk-bloggen från RedGate.
Den publicerar många underhållande och intressanta inlägg.
Jag är inte ansluten till några företagsprodukter RedGate, inte heller med deras försäljning.

Som utlovat, böcker för den som vill veta mer
Jag rekommenderar tre mycket bra böcker från mig själv (länkar leder till tända versioner i butiken Amazon):

I princip kan du öppna enkla index Lägg till taggar
Microsoft SQL Server 2012 T-SQL Fundamentals (referens för utvecklare)
Författare Itzik Ben-Gan
Publiceringsdatum: 15 juli 2012
Författaren, en mästare på sitt hantverk, ger grundläggande kunskaper om att arbeta med databaser.
Om du har glömt allt eller aldrig visste så är det definitivt värt att läsa.

Om det finns många poster i tabellen kan det vara mycket svårt att hitta rätt post. Datasökning utförs med en brute-force-metod, det vill säga att alla tabellposter tittas igenom från den första posten till den sista posten, vilket leder till mycket tid. För att göra det lättare att hitta data i en tabell används index. Ett index, ibland kallat en pekare, är sekvensnumret för en post i en tabell. Indexet är byggt baserat på värdena för ett fält eller värden för flera fält. Ett index byggt med hjälp av värdena i ett fält kallas enkelt, och ett index baserat på värdena för två eller flera fält kallas komplext. Under indexkonstruktionen sorteras poster i tabellen efter värdena för fältet (eller fälten) i det framtida indexet. Den första raden i tabellen tilldelas sedan indexnummer ett, den andra raden tilldelas indexnummer två, och så vidare till slutet av tabellen.

Både enkla och komplexa index har sin egen typ (Ture). Primärt (Primärt) index (nyckel) är ett fält eller en grupp av fält som unikt identifierar en post, det vill säga värdena för det primära indexet är unika (upprepas inte). I en relationsdatabas kan varje tabell bara ha en primärnyckel. En tabell kan ha många främmande nycklar och de kommer att ha en av följande typer:

Kandidat - kandidat för primärnyckel eller alternativnyckel. Den har alla egenskaper hos en primärnyckel.

Unik - tillåter dubbletter av värden i fältet som det är byggt på, men endast den första posten från en grupp poster med samma indexfältvärde kommer att visas.

Vanligt - lägger inga begränsningar på värdena i indexfältet och på visningen av poster på skärmen. Indexet styr bara i vilken ordning posterna visas. Detta är den mest populära typen av index.

Relationen mellan tabeller utförs genom index, som kallas nycklar.

Det konstruerade indexet lagras i en speciell indexfil. Om indexfilen endast lagrar ett index, kallas den single-index och har filtillägget .idx. Indexfiler som lagrar många index kallas multiindexfiler och har filtillägget .cdx. Varje index som lagras i en multiindexfil kallas en tagg. Varje tagg har sitt eget unika namn.

Det finns två typer av multiindexfiler: helt enkelt multiindexfiler (beskrivs ovan) och strukturella multiindexfiler. En strukturell multiindexfil har samma namn som tabellen som den tillhör (den enda skillnaden är i filtillägget) och har följande egenskaper:

Öppnas automatiskt med sitt eget bord;

Den kan inte stängas, men den kan inte göras till den huvudsakliga.

En tabell kan ha många indexfiler, både enkelindex och multiindex. Äldre versioner av FoxPro använder Multi-Index-filer.

Skapa ett index

Det finns två sätt att skapa ett index.

A. Använda kommandot:

INDEX PÅ<индексное выражение>DEN DÄR< idx-fil> | MÄRKA<имя тега>

Syftet med alternativen:

<indexuttryck>- namnet på fältet (eller fälten) baserat på de värden som indexet ska byggas av. När du bygger ett komplext index listas fältnamnen separerade av ett + (plus)-tecken. Om ett komplext index är byggt av:

För numeriska fält byggs indexet utifrån summan av fältvärdena;

För teckenfält byggs indexet först enligt värdet på det första fältet, och i händelse av upprepade värden i det första fältet - enligt värdena i det andra fältet; om värdena för det första och andra fältet upprepas - enligt värdena för det tredje fältet, etc.;

För fält av olika typer reduceras först fältvärdena till en typ, vanligtvis tecken, och sedan byggs ett index.

Längden på indexuttrycket får inte överstiga 254 tecken.

DEN DÄR< idx-fil>- namnet på den enda indexfilen anges.

MÄRKA<имя тега> - indikerar namnet på taggen i multiindexfilen. Om alternativet används placeras den skapade taggen i den angivna multiindexfilen, och om den nödvändiga multiindexfilen saknas kommer en strukturell multiindexfil att byggas. Om alternativet utelämnas kommer den skapade taggen att placeras i den aktuella multiindexfilen.

FÖR<условие> - ställer in valläget för indexet för de tabellposter som uppfyller<условию>.

KOMPAKT- styr skapandet av en kompakt enkelindexfil. Äldre versioner av FoxPro använder det inte.

NEDÅTGÅENDE- bygger indexet i fallande ordning. Som standard byggs indexet i stigande ordning (ASCENDING). För enindexfiler kan du bara bygga ett index i stigande ordning. Om du utfärdar kommandot SET COLLATE innan du använder kommandot INDEX ON... kan du bygga en enkelindexfil i fallande ordning.

UNIK- bygger ett unikt index. Om indexfältet/indexfälten innehåller dubbla värden, kommer endast den första posten att inkluderas i indexet och de återstående posterna kommer inte att vara tillgängliga.

TILLSATS- den nyskapade indexfilen stänger inte de indexfiler som redan är öppna vid den tidpunkten. Om alternativet utelämnas stänger den nyskapade indexfilen alla tidigare öppna indexfiler.

b. Använda huvudmenyn:

I det här fallet skapas indexet antingen när tabellen skapas eller när tabellstrukturen ändras. För att göra detta, välj fliken Index (Fig. 3.1) i dialogrutan Tabelldesigner.

Varje index beskrivs med en rad i dialogrutan Tabelldesigner.

Kolumnen Namn anger taggnamnet för multiindexfilen. Om en av multiindexfilerna tidigare har öppnats, placeras det nybyggda indexet i den öppna multiindexfilen. Om indexet byggs samtidigt med skapandet av en tabellfil eller om tabellfilen inte har flerindexfiler, placeras det nybyggda indexet i en automatiskt skapad strukturell multiindexfil.

Kolumnen Ture, utrustad med en rullgardinslista, indikerar en av de giltiga indextyperna. Om indexet är byggt på en tabell som är en del av en databas, så finns det fyra möjliga värden: Primary, Candidate, Unique och Regular. Om indexet är byggt för en ledig tabell, så finns inte det primära värdet i rullgardinsmenyn.

Kolumnen Uttryck listar namnen på de fält vars värden måste användas för att bygga ett index. Om ett komplext index byggs är det bekvämare att använda uttrycksbyggaren, som startas genom att klicka på knappen till höger om inmatningsfältet.

I kolumnen Filter kan du ställa in ett logiskt villkor och bygga ett index inte för alla tabellposter, utan bara för poster som uppfyller filtervillkoret. Denna graf är också utrustad med en uttrycksbyggare. Båda byggarnas innehåll och utseende är desamma (Fig. 3.2).

I fig. Figur 3.2 visar konstruktionen av ett komplext index med två teckenfält ush_step och uch_zvan (taggnamnet uch tilldelades innan uttrycksbyggaren anropades på skärmen). "+"-tecknet som indikerar konstruktionen av ett komplext index tas från rullgardinsmenyn String.

Listrutan String listar giltiga strängfunktioner. Likaså listar matte, logisk och datum giltiga matematiska, logiska och datumfunktioner. Den önskade funktionen från dessa rullgardinslistor väljs genom att klicka med vänster musknapp. Fältnamn (Fältlista) och variabelnamn (Variabellista) väljs genom att dubbelklicka på vänster musknapp. Det resulterande uttrycket placeras i uttrycksfönstret.

Listrutan Från tabell anger namnet på tabellen från vilken fälten tas för att bygga indexet. Om så önskas kan du beställa vilken tabell som helst från den aktuella databasen och ta vilket fält som helst för att bygga ett index.

1) Begreppet index
Indexär ett verktyg som ger snabb åtkomst till tabellrader baserat på värdena i en eller flera kolumner.

Det finns mycket variation i den här operatören eftersom den inte är standardiserad, eftersom standarder inte tar upp prestandaproblem.

2) Skapa index
SKAPA INDEX
PÅ()

3) Ändra och ta bort index
För att kontrollera aktiviteten i indexet används operatören:
ÄNDRA INDEX
För att ta bort ett index, använd operatorn:
SLIPP INDEX

a) Regler för tabellval
1. Det är lämpligt att indexera tabeller där högst 5 % av raderna är valda.
2. Tabeller som inte har dubbletter i WHERE-satsen i SELECT-satsen ska indexeras.
3. Det är inte praktiskt att indexera ofta uppdaterade tabeller.
4. Det är olämpligt att indexera tabeller som inte upptar mer än 2 sidor (för Oracle är detta färre än 300 rader), eftersom hela genomsökningen inte tar längre tid.

b) Regler för kolumnval
1. Primära och främmande nycklar - används ofta för att sammanfoga tabeller, hämta data och söka. Dessa är alltid unika index med maximal användbarhet
2. När du använder referensintegritetsalternativ behöver du alltid ett index på FK.
3. Kolumner som data ofta sorteras och/eller grupperas efter.
4. Kolumner som ofta söks i WHERE-satsen i en SELECT-sats.
5. Du bör inte skapa index på långa beskrivande kolumner.

c) Principer för att skapa sammansatta index
1. Sammansatta index är bra om de enskilda kolumnerna har få unika värden, men ett sammansatt index ger mer unikhet.
2. Om alla värden som valts av SELECT-satsen tillhör ett sammansatt index, väljs värdena från indexet.
3. Ett sammansatt index bör skapas om WHERE-satsen använder två eller flera värden kombinerade med AND-operatorn.

d) Det rekommenderas inte att skapa
Det rekommenderas inte att skapa index på kolumner, inklusive sammansatta sådana, som:
1. Används sällan för att söka, slå samman och sortera frågeresultat.
2. Innehåller ofta växlande värden, vilket kräver frekvent uppdatering av indexet, vilket saktar ner prestandan för databasen.
3. Innehåller ett litet antal unika värden (mindre än 10 % m/f) eller ett övervägande antal rader med ett eller två värden (leverantörens hemort är Moskva).
4. Funktioner eller ett uttryck tillämpas på dem i WHERE-satsen, och indexet fungerar inte.

e) Vi får inte glömma
Du bör sträva efter att minska antalet index, eftersom ett stort antal index minskar hastigheten på datauppdateringen. Därför rekommenderar MS SQL Server att inte skapa fler än 16 index per tabell.
Vanligtvis skapas index för frågeändamål och för att upprätthålla referensintegritet.
Om indexet inte används för frågor, bör det tas bort och referensintegriteten bör säkerställas med hjälp av triggers.

För att ge snabb åtkomst till Oracle DBMS-tabellrader används index. Index ger snabb åtkomst till data under operationer som väljer ett relativt litet antal tabellrader.

Även om Oracle tillåter ett obegränsat antal index på en tabell, är index bara användbara när de används för att påskynda frågor. Annars tar de bara upp utrymme och minskar serverns prestanda vid uppdatering av indexerade kolumner. Du måste använda funktionen EXPLAIN PLAN (exekverings- och statistikplan) för att avgöra hur index används i dina frågor. Ibland, om indexet inte används som standard, kan du använda frågetips för att använda indexet.


Skapa index efter att ha infogat tabelldata

Vanligtvis infogar eller läser du in data i en tabell innan du skapar index. Annars kommer overheaden för att uppdatera index att sakta ner infognings- eller laddningsoperationer. Det enda undantaget från denna regel är ett index på en klusternyckel. Det kan bara skapas för ett tomt kluster.

Byt till tillfälligt tabellutrymme för att undvika problem med ledigt utrymme när du skapar index

När du skapar ett index på en tabell som redan innehåller data kräver Oracle ytterligare minne för sortering. Detta använder det sorteringsminnesområde som tilldelats indexskaparen (beloppet som tilldelas för varje användare ställs in av initialiseringsparametern SORT_AREA_SIZE), dessutom måste Oracle-servern spola och byta information från temporära segment som tilldelats under indexskapandet. Om indexet är mycket stort, rekommenderas att du gör följande:

  1. Skapa ett nytt temporärt tabellutrymme med CREATE TABLESPACE-satsen.
  2. Ange detta nya temporära utrymme i parametern TEMPORARY TABLESPACE i ALTER USER-satsen.
  3. Skapa ett index med CREATE INDEX-satsen.
  4. Släpp det här tabellutrymmet med kommandot DROP TABLESPACE. Använd sedan ALTER USER-satsen för att återställa det ursprungliga tabellutrymmet som temporärt.

Välj rätt tabeller och kolumner för indexering

Använd följande riktlinjer för att avgöra när ett index ska skapas.

  1. Skapa ett index om du ofta hämtar ett relativt litet antal (mindre än 15%) rader från en stor tabell. Denna procentandel är starkt beroende av den relativa hastigheten för tabellskanningen och hur klustrad raddata är i indexnyckeln. Ju högre surfhastighet, desto lägre procentandel, ju mer klustrad raddata är, desto högre procentandel.
  2. Indexkolumner som används i sammanfogningar för att förbättra prestandan för att sammanfoga flera tabeller.
  3. Index skapas automatiskt baserat på de primära och unika nycklarna.
  4. Små tabeller behöver inte indexeras. Om du märker att frågekörningstiden har ökat avsevärt, har den troligen blivit stor.
Vissa kolumner är tydliga kandidater för indexering. De har följande egenskaper:
  • värdena i kolumnen är relativt unika;
  • stort utbud av värden (lämplig för vanliga index);
  • litet värdeområde (lämplig för bitindex);
  • mycket glesa kolumner (många odefinierade, "tomma" värden), men frågor handlar mest om meningsfulla rader. I det här fallet är en jämförelse som matchar alla icke-nullvärden att föredra:
    WHERE COL_X > -9,99 *power(10, 125) istället för
    WHERE COL_X INTE ÄR NULL Detta beror på att det första fallet använder COL_X-indexet (förutsatt att COL_X-kolumnen är en numerisk typ).

Begränsa antalet index per tabell

Ju fler index, desto högre blir omkostnaden vid ändring av en tabell. När rader läggs till eller tas bort uppdateras alla index i tabellen. När en kolumn uppdateras måste även alla index som den deltar i uppdateras.

När det gäller index måste du väga prestandavinsterna för frågor kontra prestandastraffen för uppdateringar. Till exempel, om tabellen huvudsakligen är skrivskyddad, kan du använda index i stor utsträckning; men om tabellen uppdateras ofta, är det tillrådligt att minimera användningen av index.

Välj ordningen på kolumner i sammansatta index

Även om kolumner kan anges i valfri ordning i CREATE INDEX-satsen, kan ordningen på kolumnerna i CREATE INDEX-satsen påverka frågeprestanda. I allmänhet listas de kolumner som kommer att användas oftast först i indexet. Du kan skapa ett sammansatt index (med flera kolumner), som kan användas för att fråga alla kolumner som ingår i indexet eller bara några.

Samla statistik för korrekt användning av index

Index kan användas mer effektivt om databasen samlar in och underhåller statistik om de tabeller som används i frågor. Du kan samla in statistik under indexskapandet genom att ange nyckelordet COMPUTE STATISTICS i CREATE INDEX-satsen. Eftersom data ständigt uppdateras och fördelningen av värden ändras, bör statistik uppdateras regelbundet med DBMS_STATS.GATHER_TABLE_STATISTICS- och DBMS_STATS.GATHER_SCHEMA_STATISTICS-procedurerna.

Förstör onödiga index

Indexet raderas i följande fall:

  • om användningen av ett index inte förbättrar frågeprestanda. Denna situation uppstår om tabellen är för liten eller om tabellen har många rader, men få av dem är indexposter;
  • om dina förfrågningar om förslag inte använder indexet;
  • om indexet också tas bort innan det byggs om.
När ett index släpps, returneras alla omfattningar av indexsegmentet till det tabellutrymme de tillhör och görs tillgängliga för andra objekt i det tabellutrymmet. Index raderas automatiskt när tabellen som de byggdes för förstörs.

Och index, det här speciella uppslagstabeller, som en databassökmotor kan använda för att påskynda datahämtningen. Enkelt uttryckt är ett index en pekare till data i en tabell. Indexet i databasen är mycket likt indexet längst bak i boken.

Om du till exempel vill ha länkar till alla sidor i en bok om ett visst ämne, konsultera först indexet, som listar alla ämnen i alfabetisk ordning och sedan hänvisar till ett eller flera specifika sidnummer.

Indexet hjälper till att påskynda frågor och meningar, men det saktar ner datainmatningen, med uttalanden UPPDATERING Och FÖRA IN. Index kan skapas eller raderas utan att data påverkas.

Att skapa ett index innebär ett uttalande SKAPA INDEX, som låter dig namnge ett index för att specificera tabellen och vilken eller vilka kolumner som ska indexeras och för att indikera om indexet är i stigande eller fallande ordning.

Index kan också vara unika, med begränsningen UNIK, så att indexet förhindrar dubbletter av poster i en kolumn eller kombination av kolumner som har ett index på sig.

CREATE INDEX kommandot

Grundläggande syntax SKAPA INDEX som följer:

CREATE INDEX index_name ON table_name;

Index med en kolumn

Ett enda kolumnindex skapas på endast en kolumn i tabellen. Den grundläggande syntaxen är som följer.

CREATE INDEX index_name ON table_name(column_name);

Unika index

Unika index används inte bara för drift, utan också för att säkerställa dataintegritet. Ett unikt index tillåter inte att några dubbletter av värden infogas i tabellen. Den grundläggande syntaxen är som följer.

SKAPA UNIKT INDEX index_name on table_name(column_name);

Sammansatta index

Ett sammansatt index är ett index på två eller flera kolumner i en tabell. Dess grundläggande syntax är följande.

CREATE INDEX index_name on table_name(column1, column2);

Oavsett om du skapar ett index på en enskild kolumn eller ett sammansatt index, ta hänsyn till kolumnen/kolumnerna som du kan använda väldigt ofta i en WHERE-fråga som ett filtervillkor.

Om det bara finns en kolumn i bruk måste ett index väljas på en kolumn. Om det finns två eller flera kolumner som ofta används som filter i WHERE-satsen, skulle ett sammansatt index vara ett bättre val.

Implicita index

Implicita index är index som skapas automatiskt på databasservern när ett objekt skapas. Index skapas automatiskt på primärnyckeln och den unika begränsningen.

DROP INDEX kommando

Index kan raderas med SQL-kommandot SLÄPPA. Du bör vara försiktig när du tar bort ett index eftersom prestandan antingen kan vara långsammare eller bättre.

Den grundläggande syntaxen är följande:

SLÄPP INDEX index_name;

Du kan titta på INDEX-begränsningsexemplet för att se några riktiga exempel på index.

När bör du undvika index?

Även om index är avsedda att förbättra databasens prestanda, finns det tillfällen då de bör undvikas.

Följande instruktioner anger när indexanvändning bör omprövas.

  • Index bör inte användas på små tabeller.
  • Tabeller som ofta har stora uppdateringar eller infogningsåtgärder.
  • Index bör inte användas på kolumner som innehåller ett stort antal nollvärden.
  • Kolumner som manipuleras ofta bör inte indexeras.


 


Läsa:



Tävling för barn "Det är coolt att vara bra!"

Tävling för barn

Resultaten av rittävlingen "Slaget om Stalingrad genom ögonen på ett barn från 2000-talet" har sammanfattats. Arrangörerna av tävlingen IDC "Perspective" MBU "MIBS" och...

• Du skapar ett test •. Hur gör man sitt eget test? Gör ett test på hur bra det är

• Du skapar ett test •.  Hur gör man sitt eget test?  Gör ett test på hur bra det är

Ett test med tydlig struktur och standard driftalgoritm. Men innan du börjar skapa testet måste du bestämma dig för dess...

Uppdatering av katalogidentifierare för metadataobjekt är inte exklusivt. Uppdatera hjälpdata 1c nedladdningsbearbetning

Uppdatering av katalogidentifierare för metadataobjekt är inte exklusivt. Uppdatera hjälpdata 1c nedladdningsbearbetning

Undersystem "Utvecklarverktyg" (Starykh Sergey, 1C 8.2, 8.3) 2017-02-15T12:53:51+00:00 Utvecklarverktyg skrivs super...

Samsung Galaxy A9 Star Pro: den första smarttelefonen med en fyrkamera Minneskort används i mobila enheter för att öka minneskapaciteten för att spara data

Samsung Galaxy A9 Star Pro: den första smarttelefonen med en fyrkamera Minneskort används i mobila enheter för att öka minneskapaciteten för att spara data

I slutet av september, tack vare insiders, dök information upp på nätverket om Samsung Galaxy A9 Star Pro, som visade sig vara en mycket ovanlig smartphone...

feed-bild RSS