sql >> Database teknologi >  >> RDS >> Sqlserver

Tips til at rette SQL Server Index Fragmentation

SQL Server-indeksfragmentering er en almindelig kilde til forringelse af databasens ydeevne. Fragmentering opstår, når der er meget tom plads på en dataside (intern fragmentering), eller når den logiske rækkefølge af siderne i indekset ikke stemmer overens med den fysiske rækkefølge af siderne i datafilen (ekstern fragmentering).

Fragmenteringsrelaterede ydeevneproblemer observeres oftest, når der udføres forespørgsler, der udfører indeksscanninger. Forespørgsler, der udfører indekssøgninger, bliver muligvis ikke påvirket af høj indeksfragmentering.

Forstå typerne af SQL Server Index Fragmentation

Intern indeksfragmentering

Intern fragmentering opstår, når datasider har for meget ledig plads. Denne ekstra plads introduceres gennem et par forskellige veje:

  • SQL Server gemmer data på 8KB sider. Så når du indsætter mindre end 8 KB data i en tabel, står du tilbage med tom plads på siden.
  • Omvendt, hvis du indsætter flere data, end siden har plads til, sendes det overskydende til en anden side. Det er usandsynligt, at de yderligere data vil fylde de efterfølgende sider perfekt, så du står igen med tom plads på en side.
  • Bom plads på en dataside forekommer også, når data slettes fra en tabel.

Intern fragmentering forårsager primært ydeevneproblemer, når SQL Server laver en indeksscanning. Ydeevnen bliver langsommere, når SQL Server skal scanne mange delvist udfyldte sider for at finde de data, den leder efter.

Ekstern indeksfragmentering

Ekstern fragmentering er et resultat af, at datasider er ude af drift. Dette er forårsaget af indsættelse eller opdatering af data til helbladssider. Når data føjes til en hel side, opretter SQL Server en sideopdeling for at rumme de ekstra data, og den nye side adskilles fra den originale side.

Ekstern fragmentering forårsager ydeevneproblemer ved at øge tilfældig I/O. Når sider ikke er sekventielle, skal SQL Server læse data fra flere lokationer, hvilket er mere tidskrævende end at læse i rækkefølge.

Sådan undgår du SQL Server-indeksfragmentering

Det er ikke muligt at forhindre indeksfragmentering fuldstændigt, men der er måder at minimere dens forekomst og mindske effekten af ​​fragmentering på databasens ydeevne. Her er nogle dos and don'ts for at undgå SQL Server-indeksfragmentering:

GØR: Vælg klyngenøgler, der er stadigt stigende værdier eller stadigt faldende værdier. Dette vil reducere sideopdelinger, fordi når du indsætter poster, vil de blive placeret i begyndelsen eller slutningen af ​​den logiske sidekæde.

GØR IKKE: Indsæt poster med tilfældige nøgleværdier. Vælg statiske nøgleværdier, så når først en post er placeret, behøver den aldrig at flytte sig og vil ikke gå ud af drift.

GØR IKKE: Opdater poster for at gøre dem længere. Tilføjelse af poster til et indeks under en opdatering kan kræve, at SQL Server skubber nogle af dataene til en ny side. Dette kan resultere i ikke-sekventielle bladsider og i sidste ende ydeevneproblemer.

GØR IKKE: Opdater indeksnøglekolonner. Opdateringer af nøglekolonne kræver sletning af en hel række efterfulgt af en hel rækkeindsættelse med den nye nøgleværdi. Hvis den nye række indsættes på en side uden nok plads, får du en sideopdeling.

GØR: Vær opmærksom på funktioner, der kan forårsage sideopdelinger. Husk de potentielle slutresultater af at ændre enhver funktion, der involverer indekser. For eksempel kan opdatering af kolonner med variabel bredde (selv i ikke-nøglekolonner) i et klynget indeks forårsage sideopdelinger.

GØR: Implementer passende indeksfyldningsfaktorer. Analyser fragmentering ved standardindstillingen for fyldfaktor og juster efter behov for at minimere overdreven fragmentering ved normal belastning.

Sådan rettes SQL Server Index Fragmentation

Fordi det er umuligt at forhindre fragmentering 100 procent af tiden, er det vigtigt at vide, hvordan man løser SQL Server-indeksfragmentering, hvis ydeevnen lider.

Før du kan beslutte, hvordan du skal gribe dit SQL Server-indeksfragmenteringsproblem an, skal du først bestemme, hvor omfattende et problem du har at gøre med.

Det bedste sted at starte er at bruge sys.dm_db_index_physical_stats DMF til at analysere fragmenteringsniveauet af dine indekser. Når du ved, hvor omfattende indeksfragmenteringen er, kan du plotte din angrebsplan med en af ​​tre løsninger:genopbygg indekset, reorganiser indekset eller gør ingenting.

Genopbyg: Genopbyg indekser, når fragmenteringen når mere end 30 procent.

Omorganiser: Reorganiser indekser med mellem 11-30 procent fragmentering.

Ignorer: Fragmenteringsniveauer på 10 procent eller mindre bør ikke udgøre et præstationsproblem, så du behøver ikke at gøre noget.

SQL Server-indeksfragmentering er uundgåelig, men du kan minimere de negative virkninger af fragmentering på databasens ydeevne. Følg nogle få enkle bedste fremgangsmåder, og hold dig på forkant med planlagt vedligeholdelse for at afbøde eventuelle større fragmenteringsrelaterede ydeevneproblemer.


  1. bbPress:Sådan finder du kortlægninger af vedhæftede filer til deres respektive indlæg

  2. Hvordan CONV() virker i MariaDB

  3. Hvordan statement_timestamp() virker i PostgreSQL

  4. Oprettelse af en ODBC-linket server uden at konfigurere en datakilde