Mitul că PICĂTURĂ și TRUNCATE TABLE sunt Non-Autentificat

posted in: Articles | 0

Nu este un mit persistent în SQL Server lume că atât DROP TABLE și TRUNCATE TABLE comenzi sunt non-conectat.

nu sunt. Ambele sunt complet înregistrate, dar înregistrate eficient.

puteți dovedi cu ușurință acest lucru pentru dvs., Executați următorul cod pentru a configura o baza de date de testare și de masă, și arată avem 10.000 de rânduri în tabelul nostru:

Rezultate:

RowCount
—-
10000

Și apoi următorul cod, care trunchiază masă într-o tranzacție și verifică numărul de rând:

BEGIN TRAN;GOTRUNCATE TABLE ;GO SELECT COUNT (*) AS N'RowCount'FROM ;GO

Rezultate:

RowCount
—-
0

Acum tabelul este gol., Dar pot să se rostogolească înapoi de tranzacție și a pus toate datele înapoi din nou:

ROLLBACK TRAN;GO SELECT COUNT (*) AS N'RowCount'FROM ;GO

Rezultate:

RowCount
—-
10000

Clar TRUNCATE operațiunea trebuie să fie conectat în caz contrar se rostogolească înapoi operațiunea nu ar funcționa.deci, de unde provine concepția greșită?

provine din comportamentul operațiunilorDROP șiTRUNCATE pe mese mari., Ei vor finaliza aproape instantaneu, și dacă te uiți în jurnalul de tranzacții folosind fn_dblog imediat după aceea, veți vedea doar un număr mic de înregistrări jurnal generate de operațiune. Acest număr mic nu se corelează cu dimensiunea tabelului trunchiat sau scăzut, așa că se pare că DROPși TRUNCATE operațiunile nu sunt înregistrate.

dar sunt complet înregistrate, așa cum am demonstrat mai sus. Deci, în cazul în care sunt înregistrările jurnal pentru operațiunile?,

răspunsul este că înregistrările jurnal vor fi create, doar nu imediat, printr-un mecanism numit „picătură amânată”, care a fost adăugat în SQL Server 2000 SP3.

când un tabel este abandonat sau trunchiat, toate paginile de fișiere de date alocate pentru tabel trebuie să fie dezalocate.,uire exclusiv alocarea de blocare pe măsură
Sonda pagina de blocare pentru fiecare pagină în măsura în care (a obtine blocarea în mod exclusiv, și imediat aruncă-l, asigurându-vă că nimeni altcineva nu are pagina blocat)
NU elibera măsura de blocare, care garantează că nimeni altcineva nu poate folosi acel măsură
trece la următoarea măsură
End

Ca toate măsura încuietori au avut loc până la sfârșitul operațiunii, și fiecare blocare nevoie de o cantitate mică de memorie, a fost posibil pentru blocare manager pentru a alerga afară de memorie atunci când un DROP sau TRUNCATE de o foarte mare masă a avut loc., Unii clienți SQL Server a început să găsească au fugit în condiții de out-of-memorie pe SQL Server 2000, ca tabele a crescut foarte mare și cu mult depășit creșterea în memoria sistemului.

amânat-drop mecanism simulează DROP sau TRUNCATE operațiunea de completare imediat, de desprinzându alocările pentru masă și punându-le pe amânat-drop coadă’, pentru prelucrare ulterioară de către o sarcină de fundal. Această operație de deconectare și transfer generează doar o mână de înregistrări de jurnal., Aceasta este operațiunea care se face și derulată înapoi în exemplul meu de cod de mai sus.
‘amânat-drop fundal sarcina’ se rotește la fiecare câteva secunde și deallocates toate paginile și extinderi pe amânat-drop coadă în loturi mici, garantând că operațiunea nu va alerga afară de memorie. Aceste deallocations sunt toate complet conectat, dar amintiți-vă că deallocating o pagină întreagă de date sau indicele de înregistrări nu log individuale șterge din aceste evidențe; în schimb întreaga pagină este doar marcat ca dezafectat în cauză PFS (Pagina Spațiu Liber) alocarea byte-harta.,

De la SQL Server 2000 SP3 încoace, atunci când efectuați un DROP sau TRUNCATE un tabel, veți vedea doar câteva înregistrări jurnal generate. Dacă așteptați un minut sau cam asa ceva, și apoi uita-te în Jurnalul de tranzacții din nou, veți vedea mii de înregistrări jurnal au fost generate de operațiunea amânate-drop, fiecare deallocating o pagină sau măsură. Operațiunea este înregistrată complet și eficient.,

Aici e un exemplu, folosind scenariul ne-am creat mai sus:

CHECKPOINT;GOTRUNCATE TABLE ;GOSELECT COUNT (*) AS N'LogRecCount'FROM fn_dblog (NULL, NULL);GO

Rezultate:

LogRecCount
—-
25

după Cum puteți vedea, există în mod clar nu sunt înregistrări jurnal deallocating la 10.000 de pagini, plus 1.250 de proporții în TestTable masă.

Dacă nu, așteptați câteva secunde, și apoi atunci a alerga fn_dblog codul din nou, am înțeles:

LogRecCount
—-
3811

s-ar putea întreba de ce nu sunt cel puțin 10.000 de înregistrări jurnal – unul pentru fiecare pagină fiind dezafectat., Asta pentru că pe pagina deallocations sunt chiar conectat eficient – cu un jurnal de înregistrare reflectând PFS pagina de alocare modificări pentru 8 consecutive în fișier de date pagini, în loc de un jurnal de înregistrare pentru fiecare fișier de date pagina reflectă alocarea modificarea stării în PFS pagina.SQL Server încearcă întotdeauna să producă cât mai puțin jurnal de tranzacții posibil, respectând în același timp regulile privind înregistrarea completă sau minimă pe baza modelului actual de recuperare., Dacă doriți să se uite la înregistrări jurnal generate de desfă-și-transfer și amânat-drop mecanisme, pur și simplu substitut * pentru COUNT (*) în fn_dblog codul de mai sus si uita-te pentru o tranzacție cu Tranzacție Numele setat la DeferredAllocUnitDrop::Process.în postările viitoare voi discuta despre internele care stau la baza altor mituri persistente în jurul aspectelor de performanță ale motorului de stocare SQL Server.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *