af: Brady Upton | opdateret: 2016-06-22 / Kommentarer (5)/relateret: mere > fragmentering og Indeksvedligeholdelse
Problem
vi har alle hørt om database / indeksfragmentering (og hvis du ikke har gjort det, Fortsæt læsning), men hvad er det? Er det et problem? Hvordan ved jeg, om den findes i min database?Hvordan løser jeg det? Disse spørgsmål kan være et tip i sig selv, men jeg vil forsøge at give dig en ide om hver i dette tip.
løsning
uden at gå i detaljer, gemmer vi data på 8KB sider. Når vi indsætter data i en tabel, tildeler vi en side til at gemme disse data, uden at de indsatte data er mere end 8 KB, hvor de spænder over flere sider.Hver side er tildelt en tabel. Hvis vi opretter 10 tabeller, har vi 10 forskellige sider.
når du indsætter data i en tabel, går dataene først til transaktionslogfilen. Transaktionslogfilen er en sekventiel postbetydning, når du indsætter, opdaterer og sletter posterloggen registrerer disse transaktioner fra start til slut. Datafilen på den anden side er ikkefølgende. Logfilen skyller dataene til datafilen, der opretter sider overalt.
nu hvor vi har en ide om, hvordan data gemmes, hvad har det at gøre medfragmentering?
der er to typer fragmentering: intern fragmentering og ekstern fragmentering.
intern fragmentering
intern fragmentering er forårsaget af sider, der har for meget ledig plads.Lad os foregive i begyndelsen af dagen, at vi har en tabel med 40 sider, der er100% fuld, men ved udgangen af dagen har vi en tabel med 50 sider, der kun er80% fuld på grund af forskellige slet og indsæt udsagn hele dagen.Dette forårsager et problem, fordi nu når vi skal læse fra denne tabel, har vi toscan 50 sider i stedet for 40, hvilket skulle kunne resultere i et fald i ydeevnen.Lad os se et hurtigt og beskidt eksempel.
lad os sige, at jeg har følgende tabel med en primær nøgle og et ikke-grupperet indeks på FirstNameand LastName:
Jeg vil tale om måder at analysere fragmentering senere i dette tip, men for Nuvi kan højreklikke på indekset, klikke på Egenskaber og fragmentering for at se fragmenteringog sidefylde. Dette er et helt nyt indeks, så det er på 0% fragmentering.
lad os indsætte 1000 rækker i denne tabel:
INSERT INTO Person VALUES('Brady', 'Upton', '123 Main Street', 'TN', 55555)GO 1000
lad os nu tjekke vores indeks igen:
Du kan se, at vores indeks bliver 75% fragmenteret, og den gennemsnitlige procent af fullpages (side fylde) stiger til 80%. Denne tabel er stadig så lille, at 75% fragmenteringvil sandsynligvis ikke forårsage nogen ydelsesproblemer, men da tabellen stiger i størrelseog sidetællinger øges, kan du se ydeevnen forringes. Du kan også se fraskærmbillede ovenfor, at denne tabel gik fra 0 sider til 4.Ekstern Fragmentering
ekstern fragmentering er forårsaget af sider, der er ude af drift. Lad ospretend i begyndelsen af dagen har vi et perfekt bestilt bord. I løbet af dagen udsender vi hundredvis af opdateringserklæringer, der muligvis efterlader noget tomt rum påen side og forsøger at passe plads til andre sider. Dette betyder, at vores opbevaring skal hoppe rundt for at få de nødvendige data i stedet for at læse i en retning.
analyse af fragmentering af servere
så er fragmentering et problem? Det tror jeg, det er. Hvis du kan gemme hele din database i hukommelsen, eller hvis din databaseis kun læses, ville jeg ikke bekymre mig om det, men de fleste af os har ikke den luksus.Jeg har arbejdet på tusinder af servere, og analyse af fragmenteringsniveauer er en af de første ting, jeg ser på. Faktisk, bare ved at fastsætte fragmentering, har jeg set op til200% forbedringer i forespørgselsydelse.når du taler om at analysere fragmenteringsniveauer, undrer du dig måske over, hvordan vi kan gøredette. Nå, der er et par måder…
DBCC VISCONTIG – denne funktion er gammel og vil blive fjernet i fremtidige versioneraf
sys.dm_db_indeks_fysisk_stats – introduceret i DMV Server 2005, denne dynamiske ledelsesvisning (DMV) returnerer størrelse og fragmenteringsoplysninger for data og indekser den angivne tabel eller visning.
SELECT OBJECT_NAME(ips.OBJECT_ID) ,i.NAME ,ips.index_id ,index_type_desc ,avg_fragmentation_in_percent ,avg_page_space_used_in_percent ,page_countFROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') ipsINNER JOIN sys.indexes i ON (ips.object_id = i.object_id) AND (ips.index_id = i.index_id)ORDER BY avg_fragmentation_in_percent DESC
tredjepartsprogrammer – tredjepartsprogrammer hjælper med at identificere fragmenteringsså du ikke behøver det. Greg Robidou tilbyder et godt tip om Idera ‘ s Defrag Managerher.
Hvordan løser vi det nu, hvor vi har fundet fragmentering i databasen? Ligesomanalyser indekser, der er flere måder.maintenance plans – Maintenance plans leveres med maintenance plans og er rart for nogle opgaver. Indeksvedligeholdelse er efter min mening ikke en afdem. Du kan tilføje en Genopbyg indeks opgave eller omorganisere indeks opgave i maintenanceplan, men problemet er, at du ikke rigtig kan anvende nogen logik til planen. Udenlogic vil planen genopbygge / omorganisere hvert indeks. Nogle indekser må ikkevære fragmenteret, så de ikke behøver at blive genopbygget. Nogle indekser kan have minimum fragmenteringså de ville være fint med en reorganisere. Der er ingen måde at specificere dette i en vedligeholdelseplan. Server 2016 der er nye muligheder for styring af fragmentering.
brugerdefineret Script – brugerdefinerede scripts er sandsynligvis vejen at gå, fordi Dukan anvende logik til at kontrollere indeksfragmentering og derefter beslutte, om du vil springe overindekset, omorganisere eller genopbygge. Jeg brugerola Hallengrens scriptsog de gør præcis, hvad jeg har brug for dem til at gøre. Msskltips.com har også disse ressourcer-fragmentering af servere og Indeksvedligeholdelsestips.
tredjepartsprogrammer – tredjepartsprogrammer hjælper med at defragmentere indekserså du behøver ikke.
næste trin
- dette tip giver dig en ide om nogle af de komponenter, der er involveret i indeksfragmentering. MSSQLTips.com tilbyder mere omfattende tips fokuseret på hveraf de emner, jeg nævnte her.
- sørg for at tjekke outChad Boyds tutorial om fragmentering af servere, der giver stor indsigt i adskillige emner vedrørende fragmentering
sidst opdateret: 2016-06-22
About the author
View all my tips
- More SQL Server DBA Tips…