sql >> Databasteknik >  >> RDS >> Sqlserver

Tips för att fixa SQL Server Index Fragmentation

SQL Server-indexfragmentering är en vanlig källa till försämring av databasprestanda. Fragmentering uppstår när det finns mycket tomt utrymme på en datasida (intern fragmentering) eller när den logiska ordningen på sidorna i indexet inte matchar den fysiska ordningen på sidorna i datafilen (extern fragmentering).

Fragmenteringsrelaterade prestandaproblem observeras oftast när man kör frågor som utför indexskanningar. Frågor som utför indexsökningar kanske inte påverkas av hög indexfragmentering.

Förstå typerna av SQL Server Index Fragmentation

Intern indexfragmentering

Intern fragmentering uppstår när datasidor har för mycket ledigt utrymme. Detta extra utrymme introduceras genom några olika vägar:

  • SQL Server lagrar data på 8KB-sidor. Så när du infogar mindre än 8KB data i en tabell, har du tomt utrymme på sidan.
  • Omvänt, om du infogar mer data än vad sidan har plats för, skickas överskottet till en annan sida. Det är osannolikt att ytterligare data kommer att fylla de efterföljande sidorna perfekt, så du har återigen ett tomt utrymme på en sida.
  • Tomt utrymme på en datasida förekommer också när data raderas från en tabell.

Intern fragmentering orsakar främst prestandaproblem när SQL Server gör en indexskanning. Prestandan blir långsammare när SQL Server måste skanna många delvis fyllda sidor för att hitta den data den letar efter.

Extern indexfragmentering

Extern fragmentering är ett resultat av att datasidor är ur funktion. Detta orsakas av att infoga eller uppdatera data till helbladssidor. När data läggs till på en hel sida skapar SQL Server en siddelning för att ta emot extra data, och den nya sidan separeras från den ursprungliga sidan.

Extern fragmentering orsakar prestandaproblem genom att öka slumpmässig I/O. När sidor inte är sekventiella måste SQL Server läsa data från flera platser, vilket är mer tidskrävande än att läsa i ordning.

Hur man undviker SQL Server Index Fragmentation

Det är inte möjligt att förhindra indexfragmentering helt, men det finns sätt att minimera dess förekomst och minska effekten av fragmentering på databasens prestanda. Här är några saker att göra och inte göra för att undvika SQL Server-indexfragmentering:

GÖR: Välj klusternycklar som är ständigt ökande värden eller ständigt minskande värden. Detta kommer att minska siddelningarna eftersom när du infogar poster kommer de att placeras i början eller slutet av den logiska sidkedjan.

GÖR INTE: Infoga poster med slumpmässiga nyckelvärden. Välj statiska nyckelvärden så att när en post väl har placerats behöver den aldrig flyttas och kommer inte att gå ur funktion.

GÖR INTE: Uppdatera poster för att göra dem längre. Att lägga till poster till ett index under en uppdatering kan kräva att SQL Server skickar en del av data till en ny sida. Detta kan resultera i icke-sekventiella bladsidor och, så småningom, prestandaproblem.

GÖR INTE: Uppdatera indexnyckelkolumner. Nyckelkolumnuppdateringar kräver radering av en hel rad följt av en komplett radinfogning med det nya nyckelvärdet. Om den nya raden infogas på en sida utan tillräckligt med utrymme får du en siddelning.

GÖR: Var medveten om funktioner som kan orsaka siddelningar. Tänk på de potentiella slutresultaten av att ändra alla funktioner som involverar index. Till exempel kan uppdatering av kolumner med variabel bredd (även i icke-nyckelkolumner) i ett klustrat index orsaka siddelning.

GÖR: Implementera lämpliga indexfyllningsfaktorer. Analysera fragmentering med standardinställningen för fyllningsfaktor och justera efter behov för att minimera överdriven fragmentering vid normal belastning.

Hur man åtgärdar SQL Server Index Fragmentation

Eftersom det är omöjligt att förhindra fragmentering 100 procent av tiden, är det viktigt att veta hur man åtgärdar SQL Server-indexfragmentering om prestandan är försämrad.

Innan du kan bestämma dig för hur du ska närma dig ditt SQL Server-indexfragmenteringsproblem, måste du först bestämma hur omfattande ett problem du har att göra med.

Det bästa stället att börja är att använda sys.dm_db_index_physical_stats DMF för att analysera fragmenteringsnivån för dina index. När du väl vet hur omfattande indexfragmenteringen är kan du plotta din attackplan med en av tre lösningar:bygga om indexet, organisera om indexet eller göra ingenting.

Återbygga: Bygg om index när fragmenteringen når mer än 30 procent.

Omorganisera: Omorganisera index med mellan 11-30 procents fragmentering.

Ignorera: Fragmenteringsnivåer på 10 procent eller mindre bör inte utgöra ett prestationsproblem, så du behöver inte göra någonting.

SQL Server-indexfragmentering är oundviklig, men du kan minimera de negativa effekterna av fragmentering på databasens prestanda. Följ några enkla bästa praxis och håll koll på schemalagt underhåll för att mildra eventuella större fragmenteringsrelaterade prestandaproblem.


  1. Automatiserad testning av skrivbordsapplikationen:översikt över ändamålsenlighet och ramverk

  2. MySQL Förberedda uttalanden med en variabel lista med variabel storlek

  3. Att ignorera dubbletter av nycklar under 'copy from' i postgresql

  4. Få det korta månadsnamnet i PostgreSQL