Victoria asupra fragmentării, ferestre pro-l

Victoria asupra fragmentării, ferestre pro-l
Într-o zi în urmă cu câteva luni, am fost trezit de bâzâitul insistent al BlackBerry sale: clienții utilizează una dintre bazele de date mele, sa plâns că trimiterea la web aplicația creată atunci când încărcarea paginilor utilizate frecvent durează 20 până la 30 de secunde. Pe parcursul performanței săptămâni anterioare deteriorat treptat și este acum la un nivel care pic suplimentar de încărcare se poate opri sistemul. A trebuit să găsească cauza problemei, și de a face acest lucru imediat urmat. După cum am aflat, a existat un defect care apare ca urmare a unei combinații de fragmentare în tabele și fișiere de baze de date și conținutul paginii ineficiente. Și sarcina de demontare a seriei, am decis.

În acest caz, desigur, hard disk-ul a fost extrem de activ în perioada monitorizată, ceea ce a încetinit toate celelalte operațiuni. Deoarece ADO.NET este oarecum algoritm agresiv adăugarea compușilor la piscina de conectare, chiar și într-o perioadă mică de timp a procesului de utilizator cuprinde o multitudine de legături. Un număr mare de conexiuni la aceeași sursă de date crește, în general, probabilitatea de ecluze conflictuale ale datelor partajate, care, la rândul său, încetinește răspunsul SQL Server. Pe drum în timpul orelor de vârf, atunci când o mașină, se deplasează încet, întârziind mișcarea tot restul, o ușoară creștere a timpului de răspuns pe serverul de baze de date poate avea un efect în cascadă de încetinire în funcție de mediul său de aplicare.

Hard drive ca un factor de descurajare

Este important să ne amintim că de fiecare dată proces I / O include o întârziere în care controlerul este în așteptare pentru discul se rotește sub capul de citire / scriere. Prin urmare, citiți întotdeauna cele opt pagini durează mai mult de o pagină din același volum. În plus, I / O componente pentru accesul eficient nu poate organiza lectură, pentru că nu este în măsură să prezică ce întrebări să se aștepte în viitor. optimizare disc apare atunci când stocarea combinată a datelor în bucăți mari, cu cel mai mic posibil discul accesează. Raportul Filemon spune că componenta I / O dintr-un tabel de citit pagina de 2.5 GB, la un moment dat, înseamnă că ceva a împiedicat cererile de grup de motoare în ordine. Deci, trebuie să te uiți la unele dintre tabele și de a afla motivul.

Un instrument util pentru identificarea gradului de fragmentare în tabel - echipa SQL Server DBCC SHOWCONTIG. Din păcate, lansarea sa degradeaza performanta, care ar trebui să îmbunătățească doar pentru că echipa creează un număr mare de operații I / O. C impact cheie rapidă asupra performanței server este mai mică decât dacă rulați comanda fără ea. Dar chiar și execuție DBCC SHOWCONTIG echipa FAST incetineste sistemul este suficient de puternic, în cazul în care acesta este deja supraîncărcată. Este cel mai bine atunci când se utilizează baza de date Coerența Checker (DBCC) - desigur, în cazul în care există timp - efectuați o scanare completă și să instalați TABLERESULTS, pentru a scana un tabel în fișierul de ieșire, și apoi salvați rezultatele.

Am scris în limbajul de T-SQL procedură stocată uspBuildFraglist, al cărei text este prezentat în Listarea 1. Acesta ar trebui să automatizeze comanda DBCC SHOWCONTIG CU TABLERESULTS. UspBuildFraglist bucle prin lista de tabele în baza de date a spus și pentru fiecare tabel începe DBCC SHOWCONTIG CU REZULTATE DE MASĂ, ALL_INDEXES, care prezintă informația cu privire la indicele de fragmentare a datelor și a spus tabel. Rezultatele sunt mai întâi stocate într-un tabel temporar, apoi sa mutat la o masă permanentă în baza de date, care a fost proiectat pentru a fi deținute de către datele generate pentru a sprijini procesele administrative de genul asta.

Listarea 1. Procedura memorată uspBuildFraglist

Deși uspBuildFraglist procedură stocată efectuează o sarcină simplă, vă permite să verificați fragmentarea fără a compromite performanța. Această procedură produce rezultate mai precise atunci când alerga după orice lucru care ar afecta distribuirea fișierelor, cum ar fi lucrul în baza de date comprimate sau de curățare a datelor.

Interpretarea rezultatelor dbcc

Pentru a interpreta ieșirea datelor de comandă DBCC produse de uspBuildFraglist, trebuie să stabilească mai întâi dacă tabelul de inspectată grupate index. Deoarece un indice de cluster ordonează fizic datele de pe disc, conform unui câmp indexat, fragmentare apare, de obicei, atunci când datele sunt șterse din tabel, și după aceea nu a fost nu este inserat date, care să umple spațiul gol. De obicei, cauza fragmentării acestui tip, în prezența indicelui de cluster monotonă cu creșterea cheie primară, cum ar fi domeniul unic. Din păcate, cheia primară implicită este de a utiliza un index cluster, și mulți designeri de baze de date ar trebui să utilizeze câmp unic ca cheie primară.

O altă metodă comună de fragmentare ca un indici, grupate non-cluster, astfel încât este distribuția de date după un anumit timp. În sistemele OLTP de obicei noi linii sunt adăugate aproape simultan și în blocuri mici. Prin urmare, în toate tabelele dintr-un grup de fișiere vor fi plasate într-una sau două blocuri de date suplimentare, în același timp. Acest lucru înseamnă că mai multe blocuri de date pot fi împrăștiate pe tot parcursul fișierului. În cazul în care se adaugă noi linii în același ritm pe toate mesele, distribuția va fi suficient de buna. Dacă același tabel se adaugă mai multe linii decât celelalte, atunci rândurile suplimentare din tabel pot fi grupate, atunci ele vor fi doar continuitatea mici insule în marea separate prin linii. SQL Server nu încearcă să plaseze rândurile unui tabel împreună. Prin urmare, odată cu creșterea sistemelor OLTP sunt întotdeauna fragmentate.

O altă estimare folosind DBCCSHOWCONTIG utilizată pentru a verifica densitatea medie de umplere a paginii, care arată modul în care pagina medie umplut cu date. Cu toate că, probabil, în tabel nu există nici o fragmentare a paginilor, pentru că toate paginile sunt într-adevăr continuă, iar pagina poate fi locuri goale din cauza paginilor ștergere, modernizare și divizare. Deoarece SQL Server întotdeauna citește datele din cel puțin o pagină completă, un tabel de scanare sau indicele de frunze de scanare va necesita întotdeauna un număr mai mare de pagini citite de numărul de octeți utilizate, împărțit la 8192, dacă pagina conține spații goale. Citind aceste pagini suplimentare duce la mare activitate pe disc, și pentru că masa devine mare, există un impact tot mai mare asupra performanței citit, mai ales în cazul în care masa este scanat.

Fragmentarea fișierelor bazei de date

Dacă Monitorul de performanță prezintă un număr excesiv de operații I / O, ce înseamnă asta? Și dacă Filemon prezintă cel puțin 65.536 bytes la efectuarea I / O? Aceasta înseamnă că a fișierului bazei de date este fragmentată. Monitorul de performanță afișează un raport valori disc fizic, în ciuda faptului că Filemon descrie I / O la nivelul sistemului de fișiere. Pentru a descărca o pagină cu datele, sistemul de operare Windows pentru a găsi fișierul de offset pentru a stabili locația fizică a octeți pe disc. NTFS este încercarea de a reduce fragmentarea disc, determinarea poziției pentru fișierul în cea mai mare bucată de spațiu liber pe disc, fără nici o încercare de a optimiza acest aranjament. În cazul în care baza de date se extinde și contracte în mod regulat (de exemplu utilizarea de DBCC echipa SHRINKDB), atunci este posibil ca o parte din fișierele bazei de date distribuite în disc, și este puțin probabil ca aceste piese sunt comandate, iar managerul de stocare aranjează paginile în funcție de numărul.

Poate fi folosit pentru aplicarea pe disc defragmentare pentru a citi fișierul de la primul la ultimul octet de controler de disc poate fi pus în aplicare la o dată. Dar aceasta este doar o soluție parțială, deoarece cererea de defragmentare de obicei, nu se mișcă piesele de date, astfel încât acestea sunt continue. Chiar și un mic decalaj între plasarea datelor pe disc duce la așteptarea momentului în care unitatea ar trebui să rândul său, un cap de citire / scriere. Un număr mai mare de discontinuităților va avea ca rezultat întotdeauna în funcțiune mai lent în comparație cu maximum posibil.

Decizia pentru noua bază de date este de a oferi o imagine de creștere suficient spațiu pentru a crea baza de date. În cazul în care discul este nou formatat, NTFS va furniza toate într-o singură zonă continuă disc. Apoi, puteți utiliza comanda DBCC și reconstrui indicii pentru a minimiza fragmentarea.

O soluție mai eficientă a bazei de date existente, după cum urmează: a efectua o copie de rezervă completă a bazei de date, șterge baza de date (cu eliminarea fișierelor) defragmentarea discului, și apoi a restabili baza de date. Procesul de recuperare va provoca Windows să aloce spațiul disponibil pe disc din cele mai mari bucăți de spațiu liber pe disc, astfel încât paginile vor fi direct pe disc, probabil, continuă fizic. Ca urmare, componenta I / O ar trebui să organizeze solicitări de pagini mai eficient, deoarece managerul poate avea acces la datele mari de fragment într-o singură operație I / O.

Aspecte-cheie pe care le-am găsit: o masă mare și un fișier de baze de date fragmentate, precum și ineficiente pagini de umplere densitate. Consider toate cele trei aspecte pe care am nevoie să fie abordate împreună pentru a rezolva problema performanței bazei de date. Primul este cel mai mare, cel mai umplut, utilizate pentru a aborda tabel trebuie să indice cheia externă. Această problemă specială într-adevăr nu a fost cauzată de fragmentarea, și a fost asociat cu scanarea dimensiunea tabelului de 2,5 GB cu o cheie externă în timpul actualizării mesei pe câmpul cheie primară. Această scanare a fost cauza unui număr mare de disc I / Os, astfel încât era imposibil să se verifice dacă au existat alte probleme cu discul. Adăugarea indicelui redus drastic în timp ce modernizarea și I / O operațiunile de disc de timp până la aproximativ 80%, cu operațiuni de modernizare. Pentru a rezolva cele două probleme rămase, am scris o uspDefragTables procedură stocată, pe care le considerăm mai jos mai detaliat.

A doua problemă pe care am găsit a fost că masa a fost dezordonate, adică, datele sale au fost „aranjate“, în ordinea în care au fost inserate. Acest lucru în sine nu este teribil; Paginile de masă au fost doar ușor fragmentate. Deoarece datele au fost primite, de la aproximativ 75 până la 80% din numărul total de date introduse în toate tabelele bazei de date stocate cât mai aproape unul de altul. Rețineți totuși, că datele logica defragmentarea DBCC SHOWCONTIG inaplicabile datelor dezordonate; Prin urmare, aceste date cu 0% fragmentare poate fi încă un factor negativ în formarea datelor aplicației cereri.

O a treia problemă, ceea ce face ca organizația de date mai puțin eficiente - atunci când comanda DBCC SHOWCONTIG indică faptul că densitatea paginii de umplere mai mică de 50%. Se înțelege că tabelul de stocare este folosit mai mult de două pagini. Prea multe pagini pe jumătate goale împrăștiate pe fișierul de bază de date este, în realitate, o performanță slabă.

Procedura stocată în Listarea 2 uspDefragTables rezolva problema cu densitatea de pagini de umplere și organizarea datelor. Procedura iterează peste toate rândurile din tabel, care este rezultatul ieșirii comenzii DBCC SHOWCONTIG dintr-o procedură stocată uspBuild-Fraglist, și caută în tabelul care depășesc nivelul de fragmentare, a declarat la parametrul @MaxFrag, așa cum se arată în fragmentul A listare 2.

Listarea 2. stocate uspDefragTables Procedura

Procedura de UspDefragTables execută o DBCC DBREINDEX pentru fiecare indice, care are o fragmentare logică, sau fragmentarea în datele sau în cazul în care densitatea medie a paginii de umplere este mai mică decât 100- @ MaxFrag. Pentru indexurile grupate, această comandă reorganizează întregul tabel. Pentru indicii non-cluster reorganizeaza indicele la nivelul frunzelor.

Rețineți că uspDefragTables procedura ignoră cu siguranta datele neordonate (indexID = 0), deoarece DBCC DBREINDEX de comandă astfel de date nu funcționează. In schimb, DBCC DBREINDEX poate fi defragmentate pentru a crea un indecși non-cluster. Pentru a îmbunătăți organizarea necesită metode diferite, care au de multe ori să fie aplicate manual.

Sa dovedit faptul că principalul motiv pentru care am fost nevoit să se trezească la faptul că activitatea nu se desfășoară în sprijinul câteva săptămâni. Am fost ocupat cu sarcini de prioritate mai mare, și nu am avut timp pentru a afla de ce activitatea nu se desfășoară în sprijinul. În acel moment am crezut că eșecul nu a fost o problemă, pentru că mi se părea, la baza de date a devenit fragmentat, ar dura luni de zile. În acea dimineață, am dat seama că este foarte greșit, cel puțin în cazul unor tabele modificabili și aglomerate.

După ce am adăugat cod pentru a preveni o scanare de masă, și a construit un indice de cluster pentru a organiza datele mai eficient (care au fost, de asemenea, defragmentată și a avut un indicii non-cluster) de două săptămâni, am urmărit nivelul de fragmentare. A fost doar câteva zile, iar cele mai multe tabele mari au început deja să arate semne de fragmentare din nou, astfel încât, până la sfârșitul săptămânii de lucru a încetinit considerabil în jos cu ei. A devenit clar faptul că fragmentarea umbra se va ivi vreodată și numai menținerea vigilență constantă, nu putem ajunge într-o situație fără speranță.

Moris Lyuis ([email protected]) - un administrator de baze de date pentru o companie Digichart, aplicații Furnizorul de servicii pentru sănătate

Partajați imagini cu prietenii și colegii