SQLShack (Română)

SQL Server temp tabele sunt un tip special de tabele, care sunt scrise în baza acoperire de date TempDB și să acționeze ca mese regulate, oferind un loc de munca adecvat pentru intermediare de prelucrare a datelor înainte de a salva rezultatul la o masă obișnuită, așa cum se poate trăi numai pentru vârsta de conexiunea de date., tabelele SQL temp pot fi utilizate pentru a îmbunătăți performanța procedurilor stocate prin scurtarea timpului tranzacției, permițându-vă să pregătiți înregistrări pe care le veți modifica în tabelul SQL Server temp, apoi să deschideți o tranzacție și să efectuați modificările.

Există patru tipuri principale de SQL temp tabele:

  • un Local SQL Server temp de masă, care este numit, începând cu simbolul # (de exemplu, #TempShipments), care poate fi consultat numai de către baza de date curentă sesiune și aruncate de deconectare,

  • un Globale SQL temp de masă, care este numit începând cu ## (de ex., ##TempShipments), care poate fi consultat de către orice proces în baza de date curentă și aruncate atunci când baza de date originală sesiune care a creat acel tabel temp deconectat sau până în ultima declarație care a fost corelarea tabel temp-a oprit folosind-o, ca oricine care are acces la sistem acoperire de date TempDB când globale SQL temp tabelul este creat va fi capabil de a utiliza acest tabel,

  • un Persistentă SQL Server temp de masă, care este numit, începând cu o TempDB prefix, cum ar fi TempDB.DBO.TempShipments

  • și o variabilă de tabel care începe cu un prefix @ (de ex., @TempShipments)

baza De Date SQL Server Motor poate distinge între aceleași SQL tabele temporare create în timp ce executa aceeași procedură stocată multe ori simultan prin adăugarea unui generate de sistemul numeric sufix la SQL Server temp nume de tabel. Acesta este motivul pentru care numele tabelului local SQL temp nu poate depăși 116 caractere., deși ambele tabele SQL Server temp și variabile de masă sunt stocate în baza de date TempDB, există multe diferențe între ele, cum ar fi:

  • tabelele SQL temp sunt create folosind CREATE TABLE T-SQL statement, dar variabilele de masă sunt create folosind DECLARE @name Table T-SQL statement.

  • puteți modifica tabelele temporale SQL Server după crearea acestuia, dar variabilele tabelului nu acceptă nicio declarație DDL precum ALTER statement.tabelele SQL temp nu pot fi utilizate în funcțiile definite de utilizator, dar variabilele tabelului pot fi.,tabelele temporare SQL Server onorează tranzacțiile explicite definite de utilizator, dar variabilele tabelului nu pot participa la astfel de tranzacții.tabelele SQL temp acceptă adăugarea de indici cluster și non-cluster după crearea tabelului SQL Server temp și implicit prin definirea constrângerii cheie primară sau a constrângerii cheie unică în timpul creării tabelelor, dar variabilele tabelului acceptă doar adăugarea unor astfel de indici implicit prin definirea constrângerii cheie primară sau a constrângerii cheie unică în timpul creării tabelelor., tabelele SQL temp pot fi abandonate în mod explicit, dar variabilele tabelului nu pot fi abandonate în mod explicit, luând în considerare faptul că ambele tipuri sunt abandonate automat atunci când sesiunea în care sunt create este deconectată. tabelele temporale SQL Server pot fi tabele temporale locale la nivelul lotului sau al procedurii stocate în care tabelul declarat sau tabelele temporale globale unde poate fi apelat în afara lotului sau a procedurii stocate, dar variabilele tabelului pot fi apelate numai în cadrul lotului sau al procedurii stocate în care este declarat.,

În plus, SQL Server la nivel de coloană statisticile sunt generate în mod automat împotriva SQL temp mese, ajutând SQL Server Query Optimizer pentru a genera cel mai bun plan de execuție, obținerea celor mai bune performanțe atunci când interogarea SQL Server tabel temp. Dar ar trebui să ia în considerare faptul că modificarea tabelelor SQL temp de multe ori în codul poate duce la statistici obtinerea de data. Acest lucru ar necesita actualizarea manuală pentru aceste statistici, sau activarea Trace Flag 2371., În acest articol, vom vedea cum putem beneficia de capacitatea de a adăuga indexuri grupate și non-grupate în tabelele temporale SQL Server.

definirea cheie primară și constrângeri cheie unice în timpul SQL temp crearea tabelului va permite SQL Server Query Optimizer pentru a fi întotdeauna în măsură să utilizeze acești indici. Chiar și așa, acești indici împiedică inserarea valorilor non-unice în aceste coloane, ceea ce nu este cel mai bun caz în toate scenariile, care pot necesita valori non-unice. În acest caz, este mai bine să se definească în mod explicit un indice clustered sau non-clustered care ar putea fi configurat ca un indice non-unic., Adăugarea de indici la tabelele SQL temp va îmbunătăți performanța dacă indicele este ales corect, în caz contrar, poate provoca degradarea performanței. De asemenea, nu orice tabel SQL Server temp are nevoie de adăugarea de indici, deoarece depinde de multe lucruri, cum ar fi modul în care acest tabel SQL temp va fi numit, alăturat cu alte tabele uriașe sau dacă va face parte dintr-o procedură complexă stocată.,

să începem demo-ul nostru, în care vom testa performanța completării și preluării datelor din tabelele temporale SQL Server care conțin înregistrări de 100k, fără niciun index, cu un index non-cluster și cu un index cluster. Ne vom concentra pe verificarea timpului consumat de fiecare caz in parte si a planului de executie generat. Pentru a evalua consumat timp, vom declara @StartTime variabilă înainte de fiecare execuție, setați valoarea sa la GETDATE () și la sfârșitul fiecărei execuție, vom imprima data diferență (în ms) între ora curentă și ora de începere.,

mai jos script va crea menționate anterior trei SQL temp mese; temp masă fără un index, temp masă cu un non-clustered index și temp masă cu cluster de index și umple-l cu 100 de mii de înregistrări din CountryInfo test de masa si apoi de a prelua aceste înregistrări din tabelele:

Executarea script anterior, rezultatul ne va arăta că, în cazul nostru, adăugând un non-clustered index este mai rău decât să ai la masă fără să indice de 1.,e timpul, în cazul nostru, la fel ca în calendarul de mai jos în comparație ms:

Verificarea generate de planul de executie folosind ApexSQL aplicare Planul de după execuție, vom vedea că, ca nu avem aderă cu mare tabele sau interogări complexe, pentru recuperarea datelor de la cele trei mese consumă aceleași resurse (1%) și diferă în operatorul care este utilizat pentru a prelua date; Tabelul de Scanare în caz de temp masă fără index, Index Caută în caz de temp masă cu non-clustered index și Grupate Index Caută în caz de temp masă cu cluster de index.,

de Asemenea, puteți derivă din planul de execuție, care tabelul cu non-clustered index a luat cea mai mare de timp (1063 ms) și resurse (47% din totalul de execuție) în tabelul de procesul de inserare a opus la masa cu cluster de index de inserție care au avut mai puțin timp (827 ms) și resurse (32 % din totalul de executie):

În script anterior am creat un non-clustered index după umplerea temp masă și index grupat înainte de umplerea tabel temp., Dar este diferit atunci când creăm indexul înainte sau după umplerea tabelului temp?, Pentru a răspunde la această întrebare să efectuați următorul test în care vom verifica consumat timp în toate cazurile; adăugarea unui non-clustered index înainte de umplerea temp masă, adăugând un non-clustered index după umplerea temp masă, adăugând un index grupat înainte de umplerea temp tabel și adăugarea unui index grupat după umplerea temp tabel:

este clar din rezultatul generat de executarea script anterior că este mai bine pentru a crea non-clustered index după completarea tabelului, ca fiind cu 1,2% mai rapid, și de a crea index grupat înainte de a umple masa, ca asta este de 2.,5% mai rapid, datorită mecanismului care este folosit pentru a umple mesele și de a crea indici:

Verificarea planul de execuție, rezultatul ne va arăta că crearea cluster de index înainte de introducerea consumă 15,7% din totalul de execuție, în cazul în care crearea de după inserție va consuma 22% din totalul de execuție., Pe de altă parte, crearea de non-cluster indici după inserție consumă 23% din resurse, comparativ cu 25% la sută care este consumat prin crearea înainte de procesul de inserare:

Concluzie

În SQL Server, SQL temp tabele, care sunt stocate în baza acoperire de date TempDB, sunt utilizate pe scară largă pentru a oferi un loc potrivit pentru intermediare de prelucrare a datelor înainte de a salva rezultatul într-un tabel de bază., De asemenea, a folosit pentru a scurta durata tranzacțiilor de lungă durată cu blocarea minimă a tabelului de bază, luând datele, procesând-o și deschizând în final o tranzacție pentru a efectua modificarea pe tabelul de bază. Această abordare este aplicabilă pentru a adăuga indexuri non-grupate și grupate în tabelele temporale SQL Server, care ambele pot îmbunătăți performanța recuperării datelor din aceste tabele dacă indexurile sunt alese corect.,

  • Author
  • Recent Posts
Ahmad Yaseen is a Microsoft Big Data engineer with deep knowledge and experience in SQL BI, SQL Server Database Administration and Development fields.
He is a Microsoft Certified Solution Expert in Data Management and Analytics, Microsoft Certified Solution Associate in SQL Database Administration and Development, Azure Developer Associate and Microsoft Certified Trainer.,
De asemenea, el contribuie cu sfaturile sale SQL în multe bloguri.
Vezi toate posturile de Ahmad Yaseen

Ultimele posturi de Ahmad Yaseen (vezi toate)
  • Cum de a monitoriza Azure data Factory – 15 ianuarie 2021
  • Folosind Sursa de Control în Azure data Factory – ianuarie 12, 2021
  • Folosind Template-uri în Azure data Factory – 8 ianuarie 2021

Lasă un răspuns

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