sql >> Database >  >> RDS >> Sqlserver

Tips voor het repareren van SQL Server-indexfragmentatie

SQL Server-indexfragmentatie is een veelvoorkomende bron van verslechtering van de databaseprestaties. Fragmentatie treedt op wanneer er veel lege ruimte is op een gegevenspagina (interne fragmentatie) of wanneer de logische volgorde van pagina's in de index niet overeenkomt met de fysieke volgorde van pagina's in het gegevensbestand (externe fragmentatie).

Prestatieproblemen met betrekking tot fragmentatie worden het vaakst waargenomen bij het uitvoeren van query's die indexscans uitvoeren. Query's die indexzoekopdrachten uitvoeren, worden mogelijk niet beïnvloed door hoge indexfragmentatie.

De typen SQL Server-indexfragmentatie begrijpen

Interne indexfragmentatie

Interne fragmentatie treedt op wanneer gegevenspagina's te veel vrije ruimte hebben. Deze extra ruimte wordt via een aantal verschillende wegen geïntroduceerd:

  • SQL Server slaat gegevens op 8KB-pagina's op. Dus als u minder dan 8 KB aan gegevens in een tabel invoegt, blijft er lege ruimte op de pagina over.
  • Omgekeerd, als u meer gegevens invoert dan waar de pagina ruimte voor heeft, wordt het teveel naar een andere pagina gestuurd. Het is onwaarschijnlijk dat de aanvullende gegevens de volgende pagina's perfect zullen vullen, dus u houdt opnieuw lege ruimte op een pagina over.
  • Lege ruimte op een gegevenspagina komt ook voor wanneer gegevens uit een tabel worden verwijderd.

Interne fragmentatie veroorzaakt voornamelijk prestatieproblemen wanneer SQL Server een indexscan uitvoert. Prestaties vertragen wanneer SQL Server veel gedeeltelijk gevulde pagina's moet scannen om de gegevens te vinden waarnaar het zoekt.

Externe indexfragmentatie

Externe fragmentatie is een gevolg van het feit dat gegevenspagina's niet in orde zijn. Dit wordt veroorzaakt door het invoegen of bijwerken van gegevens naar volledige bladpagina's. Wanneer gegevens aan een volledige pagina worden toegevoegd, maakt SQL Server een paginasplitsing om de extra gegevens op te nemen en wordt de nieuwe pagina gescheiden van de oorspronkelijke pagina.

Externe fragmentatie veroorzaakt prestatieproblemen door willekeurige I/O te verhogen. Wanneer pagina's niet sequentieel zijn, moet SQL Server gegevens van meerdere locaties lezen, wat meer tijd in beslag neemt dan op volgorde lezen.

Hoe u SQL Server-indexfragmentatie kunt vermijden

Het is niet mogelijk om indexfragmentatie volledig te voorkomen, maar er zijn manieren om het optreden ervan te minimaliseren en het effect van fragmentatie op de databaseprestaties te verminderen. Hier zijn enkele do's en don'ts om fragmentatie van de SQL Server-index te voorkomen:

DOEN: Kies clustersleutels met steeds hogere waarden of steeds lagere waarden. Dit vermindert paginasplitsingen omdat wanneer u records invoegt, deze aan het begin of het einde van de logische paginaketen worden geplaatst.

NIET: Records met willekeurige sleutelwaarden invoegen. Kies statische sleutelwaarden zodat een record dat eenmaal is geplaatst nooit hoeft te worden verplaatst en niet uit de orde raakt.

NIET: Werk records bij om ze langer te maken. Als u records aan een index toevoegt tijdens een update, moet SQL Server mogelijk een deel van de gegevens naar een nieuwe pagina pushen. Dit kan leiden tot niet-sequentiële bladerpagina's en uiteindelijk tot prestatieproblemen.

NIET: Indexsleutelkolommen bijwerken. Bij het bijwerken van sleutelkolommen moet een volledige rij worden verwijderd, gevolgd door een volledige rij invoegen met behulp van de nieuwe sleutelwaarde. Als de nieuwe rij wordt ingevoegd op een pagina zonder voldoende ruimte, krijgt u een paginasplitsing.

DOEN: Houd rekening met functies die paginasplitsingen kunnen veroorzaken. Houd rekening met de mogelijke eindresultaten van het wijzigen van een functie waarbij indexen zijn betrokken. Het bijwerken van kolommen met variabele breedte (zelfs in niet-sleutelkolommen) in een geclusterde index kan bijvoorbeeld paginasplitsingen veroorzaken.

DOEN: Implementeer geschikte indexvulfactoren. Analyseer fragmentatie bij de standaard instelling van de vulfactor en pas indien nodig aan om overmatige fragmentatie bij normale belasting te minimaliseren.

SQL Server Index Fragmentatie repareren

Omdat het 100 procent van de tijd onmogelijk is om fragmentatie te voorkomen, is het belangrijk om te weten hoe je de fragmentatie van de SQL Server-index kunt herstellen als de prestaties eronder lijden.

Voordat u kunt beslissen hoe u uw SQL Server-indexfragmentatieprobleem aanpakt, moet u eerst bepalen met welke omvang een probleem u te maken heeft.

De beste plaats om te beginnen is het gebruik van de sys.dm_db_index_physical_stats DMF om het fragmentatieniveau van uw indexen te analyseren. Als u eenmaal weet hoe uitgebreid de indexfragmentatie is, kunt u uw aanvalsplan uitzetten met een van de drie oplossingen:de index opnieuw opbouwen, de index reorganiseren of niets doen.

Herbouwen: Herbouw indexen wanneer de fragmentatie meer dan 30 procent bereikt.

Reorganiseren: Reorganiseer indexen met een fragmentatie van 11-30 procent.

Negeren: Fragmentatieniveaus van 10 procent of minder mogen geen prestatieprobleem opleveren, dus u hoeft niets te doen.

SQL Server-indexfragmentatie is onvermijdelijk, maar u kunt de negatieve effecten van fragmentatie op de databaseprestaties minimaliseren. Volg een paar eenvoudige best practices en blijf op de hoogte van gepland onderhoud om grote fragmentatiegerelateerde prestatieproblemen te verminderen.


  1. psql - sla de resultaten van de opdracht op in een bestand

  2. PostgreSQL 13:LIMIET ... MET BANDEN

  3. Mysql voegt willekeurige datetime in een bepaald datetime-bereik in

  4. Pymysql Cursor.fetchall() / Fetchone() Retourneert Geen