Tabelele temporare sunt doar atât. Acestea sunt utilizate cel mai adesea pentru a oferi spațiu de lucru pentru rezultatele intermediare la procesarea datelor într-un lot sau o procedură. Acestea sunt, de asemenea, utilizate pentru a trece un tabel dintr-o funcție cu valoare de tabel, pentru a transmite date bazate pe tabel între procedurile stocate sau, mai recent sub formă de parametri cu valoare de tabel, pentru a trimite tabele întregi numai în citire din aplicații către rutinele SQL Server , sau treceți tabele temporare numai în citire ca parametri. După ce ați terminat de utilizat, acestea sunt aruncate automat.
Înainte de a intra prea mult în tehnologie, vă sfătuiesc să utilizați variabilele de tabel acolo unde este posibil. Sunt ușoare, iar SQL Server face treaba pentru dvs. De asemenea, tind să provoace mai puține probleme unui sistem OLTP care funcționează din greu. Doar ocazional, poate fi necesar să le reglați pentru a obține performanțe bune de la ele în jonctiuni, dar vă voi explica într-un moment, cu toate acestea, dacă efectuați prelucrări mai complexe pe date temporare sau este posibil să utilizați mai mult decât rezonabil de mici cantități de date în ele, atunci tabelele temporare locale sunt probabil o alegere mai bună.
Variabile de tabel
Variabilele de tabel sunt utilizate în cadrul rutinei sau al lotului în care sunt definite și au fost create inițial pentru a face posibile funcțiile cu valoare de tabel. Cu toate acestea, ele sunt bune pentru multe dintre utilizările la care a fost pus tabelul tradițional temporar. Se comportă ca alte variabile în regulile lor de scop. Odată ieșiți din domeniul de aplicare, sunt eliminați. Acestea sunt mult mai ușor de lucrat și destul de sigure și, de asemenea, declanșează mai puține recompilări în rutinele în care sunt utilizate decât dacă ar fi să folosiți tabele temporare. Variabilele de tabel necesită mai puține resurse de blocare, deoarece sunt „private” pentru procesul care le-a creat. Revenirea tranzacțiilor nu le afectează, deoarece variabilele de tabel au un domeniu limitat și nu fac parte din baza de date persistentă, deci sunt utile pentru crearea sau stocarea datelor care ar trebui să supraviețuiască retrocedărilor, cum ar fi intrările de jurnal. Dezavantajul variabilelor din tabel este că acestea sunt adesea eliminate înainte de a le putea investiga conținutul pentru depanare sau de a le utiliza pentru a încerca diferite expresii SQL în mod interactiv.
Dacă aplicația dvs. este conservatoare și volumele de date vă luminează Nu voi dori niciodată altceva. Cu toate acestea, puteți întâlni probleme. O dificultate este că variabilele de tabel pot fi referite numai în domeniul lor de aplicare local, deci nu le puteți procesa folosind SQL dinamic așa cum s-ar putea cu un tabel temporar sau un parametru cu valoare de tabel. Acest lucru se datorează faptului că nu puteți consulta o variabilă de tabel definită extern în cadrul SQL dinamic pe care îl executați apoi prin instrucțiunea EXEC sau prin procedura sp_ExecuteSQL
stocată, deoarece SQL-ul dinamic este executat în afara domeniului de aplicare a variabilei de tabel. Puteți, desigur, să creați și apoi să utilizați variabila de tabel din cadrul SQL dinamic, deoarece variabila de tabel ar fi în domeniul de aplicare. Cu toate acestea, odată ce SQL-ul dinamic este rulat, nu ar exista nicio variabilă de tabel
Există câteva anomalii de care să știți. De exemplu, nu puteți modifica definiția tabelului după declarația inițială DECLARE. În SQL Server 2000, o variabilă de tabel nu poate fi destinația unei instrucțiuni SELECT INTO
sau a unei INSERT EXEC
(acum remediată); Nu puteți apela funcții definite de utilizator din constrângerile CHECK, valorile DEFAULT și coloanele calculate din variabila de tabel. Singurele constrângeri care vă sunt permise dincolo de constrângerile CHECK sunt PRIMARY KEY, UNIQUE KEY și NULL / NOT NULL
Totuși, cele mai dificile probleme vin cu dimensiunea crescândă a tabelelor, deoarece, înainte de SQL Server 2016 , nu ați putut declara în mod explicit un index, iar indexurile care au impus constrângerile UNIQUE și PRIMARY KEY nu aveau indexuri de distribuție menținute pe ele. Acum puteți crea anumite tipuri de indexuri în linie cu definiția tabelului, dar statisticile de distribuție încă nu sunt menținute pe ele. Query Optimizer presupune că există un singur rând în tabel. De asemenea, nu puteți genera planuri de interogare paralele pentru o expresie SQL care modifică conținutul tabelului. Pentru a evita parțial restricția indexului, puteți utiliza constrângeri pentru a face același lucru. Cea mai esențială este constrângerea cheii principale, care vă permite să impuneți un index grupat, dar constrângerile unice sunt utile pentru performanță. Instrumentul de optimizare a interogărilor le va folosi cu bucurie dacă sunt în jur.
Cea mai mare problemă cu variabilele de tabel este că statisticile nu sunt menținute pe coloane. Acest lucru înseamnă că optimizatorul de interogări trebuie să facă o presupunere cu privire la dimensiunea și distribuția datelor și, dacă greșește, atunci veți vedea performanțe slabe la îmbinări: dacă se întâmplă acest lucru, nu puteți face altceva decât decât să reveniți la utilizarea tabelelor temporare locale clasice. Începând cu SQL Server 2019, Microsoft a introdus o nouă caracteristică numită Compilație diferită în tabel variabil, care rezolvă această problemă. Pentru a afla mai multe, citiți acest articol de la Greg Larsen.
Dacă nu utilizați SQL Server 2019, un lucru pe care îl puteți încerca este să adăugați OPTION (RECOMPILE) la instrucțiunea care implică asocierea variabilei de tabel cu alte tabele. .Acest lucru, SQL Server va putea detecta numărul de rânduri la recompilare, deoarece rândurile vor fi deja populate. Acest lucru nu rezolvă în totalitate problema, deoarece optimizatorul încă nu are statistici de distribuție și poate, de obicei, acolo unde distribuția este înclinată, să producă un plan greșit. În această demonstrație, asocierea a fost redusă în timp cu trei sferturi prin simpla adăugare a OPȚIUNII (RECOMPILE)
Acum, dacă puteți face ceea ce intră în tabele unic, puteți utiliza o constrângere de cheie primară pe aceste Mese. Acest lucru a permis optimizatorului să utilizeze o căutare de index clusterizată în loc de o scanare a tabelelor și timpul de execuție a fost prea rapid pentru a fi măsurat
Începeți cu variabilele de tabel, dar reveniți la utilizarea tabelelor temporare locale dacă întâmpinați probleme de performanță. Unii oameni sunt suficient de îndrăzneți pentru a da sfaturi în ceea ce privește numărul de rânduri dintr-un tabel și am văzut 100 sau 1000 oferite ca maxim; dar am văzut că variabilele de tabel mult mai mari se comportă perfect în mod satisfăcător în timp, iar altele mult mai mici dau probleme. Cu toate acestea, în tabelele mai mici, problema este mai puțin detectabilă!
Parametrii valorilor în tabel
Parametrul valorilor în tabel (TVP) este un tip special de variabilă de tabel care își extinde utilizarea. Când variabilele tabelului sunt transmise ca parametri, tabelul se materializează în baza de date a sistemului TempDB ca o variabilă de tabel și este trecut prin referință, un pointer către tabelul din TempDB.
Parametrii cu valoare de tabel au fost utilizați de atunci SQL Server 2008 pentru a trimite mai multe rânduri de date către o rutină Transact-SQL sau către un lot prin sp_ExecuteSQL
.. Valoarea lor specială pentru programator este că pot fi utilizate în codul TSQL ca precum și în aplicația client, deci sunt bune pentru trimiterea tabelelor client la server. De la TSQL, puteți declara variabile cu valoare de tabel, introduceți date în ele și puteți transmite aceste variabile ca parametri de valoare de tabel către proceduri și funcții stocate. Utilitatea lor mai generală este limitată de faptul că acestea sunt transmise doar ca doar în citire. Nu puteți face UPDATE
, DELETE
sau INSERT
instrucțiuni pe o valoare de tabel parametru din corpul unei rutine.
Trebuie să creați un tip de tabel definit de utilizator și să definiți o structură de tabel pentru a le utiliza. Iată un exemplu simplu de utilizare a acestora în TSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
/ * Mai întâi trebuie să creați un tabel tip. * /
CREAȚI Nume DE TIP CA TABEL
(Nume VARCHAR (10));
GO
/ * Apoi, creați o procedură pentru a primi date pentru parametrul valorii tabelului, tabelul numelor și selectați un articol din tabel * /
CREAȚI PROCEDURA ChooseAName
@CandidateNames Nume READONLY
AS
DECLARAȚI @candidates TABLE (NAME VARCHAR (10),
theOrder UNIQUEIDENTIFIER)
INSERT INTO @candidates (name, theorder)
SELECT nume, NEWID ()
FROM @CandidateNames
SELECT TOP 1
NAME
FROM @Candidates
COMANDĂ PRIN ORDINĂ
GO
/ * Declarați o variabilă care face referire la tipul listei noastre de vaci. * /
DECLARAți @MyFavouriteCowName AS Nume;
/ * Adăugați date variabilei tabelului. * /
INSERT INTO @MyFavouriteCowName (Name)
SELECT „Bossy” UNION SELECT „Bessy” UNION SELECT „petal” UNION SELECT „Daisy” UNION SELECT „Lulu” UNION SELECT ” Buttercup „UNION SELECT” Bertha „UNION SELECT” Bubba „UNION SELECT” Beauregard „UNION SELECT” Brunhilde „UNION SELECT” Lore „UNION SELECT” Lotte „UNION SELECT” Rosa „UNION SELECT” Thilde „UNION SELECT” Lisa „UNION SELECT” Peppo „UNION SELECT” Maxi „UNION SELECT” Moriz „UNION SELECT” Marla „
/ * Treceți tabelul cu lista de neme tradiționale de vaci la procedura stocată. * /
EXEC chooseAName @MyFavouriteCowName
GO
|
Ca și în cazul variabilelor de tabel, parametrul cu valoare de tabel încetează să existe odată ce este în afara domeniului, dar definiția tipului rămâne până când este eliminat în mod explicit.La fel ca variabilele de tabel, acestea nu dobândesc blocaje atunci când datele sunt completate de la un client, iar statisticile nu sunt menținute pe coloanele parametrilor cu valoare de tabel. Nu puteți utiliza un parametru cu valoare de tabel ca țintă a unei instrucțiuni SELECT INTO
sau INSERT EXEC
. Așa cum v-ați aștepta, un parametru cu valoare de tabel poate fi inclus în clauza FROM
din SELECT INTO
sau în INSERT EXEC
șir sau procedură stocată.
TVP rezolvă problema obișnuită a dorinței de a trece o variabilă locală către SQL dinamic care este apoi executat de un sp_ExecuteSQL
. Este slab documentat de Microsoft, așa că vă voi arăta un exemplu funcțional pentru a începe
Înainte de a trece la descrierea tabelelor temporare mai tradiționale și a utilizării lor, va trebui să aprofundăm locul unde se tin mese temporare. TempDB.
TempDB
Tabelele temporare și variabilele de tabelă sunt create în baza de date TempDB, care este cu adevărat o altă bază de date cu recuperare simplă: Cu TempDB, se face doar o înregistrare suficientă „minimă” pentru a permite redarea și alte caracteristici ACID. Diferența specială a TempDB este că orice obiecte precum tabelele sunt șterse la pornire. Deoarece TempDB folosește întotdeauna modelul simplu de recuperare, tranzacția finalizată este ștearsă din jurnalul de jurnal de la următorul punct de control TempDB și se păstrează doar tranzacțiile live. Acest lucru înseamnă că tabelele temporare se comportă ca orice alt tip de tabel de bază în sensul că sunt înregistrate și stocate la fel ca ele. În practică, este probabil ca tabelele temporare să rămână în memoria cache, dar numai dacă sunt utilizate frecvent: la fel ca la o tabelă de bază. TempDB operează un sistem numit reutilizare temporară a obiectelor, care va memora în cache o parte din obiectele temporare cu planul, dacă există suficientă memorie. Acest lucru poate explica legenda că obiectele temporare există doar în memorie. Adevărul ca întotdeauna este „depinde …”.
Multe alte lucruri se întâmplă în TempDB: motorul bazei de date îl poate folosi pentru plasarea tabelelor de lucru pentru verificările DBCC, pentru crearea sau reconstruirea indexurilor, cursorilor, de exemplu. Tabelele intermediare din interogările descrise ca „hashuri”, „sorturi” și „spools” sunt materializate în TempDB, de exemplu, împreună cu cele necesare pentru mai multe operațiuni „fizice” în executarea instrucțiunilor SQL. Este, de asemenea, utilizat ca magazin de versiuni pentru izolarea instantaneelor, seturi multiple de rezultate active (MARS), declanșatoare și compilare index-online.
Deoarece tabelele temporare sunt stocate la fel ca tabelele de bază, există una sau două lucruri de care trebuie să fii precaut. De exemplu, trebuie să aveți permisiunea CREATE TABLE
în TempDB pentru a crea un tabel normal. Pentru a vă salva problemele, acest lucru este atribuit în mod implicit rolului DBO (proprietar db), dar poate fi necesar să faceți acest lucru în mod explicit pentru utilizatorii cărora nu li se atribuie rolul DBO. Toți utilizatorii au permisiuni pentru a crea tabele temporare locale sau globale în TempDB, deoarece acestea le sunt atribuite prin GUEST
contextul de securitate al utilizatorului.
Clasicul tabel temporar vine în două variante, tabelul global sau partajabil, temporar, prefixat cu „##” și tabelul temporar local, al cărui nume este prefixat cu „#”. Tabelele temporare locale sunt mai puțin ca tabelele normale decât tabelele temporare globale: nu poate crea vizualizări pe ele sau nu le poate asocia declanșatoare. Este puțin dificil să descoperiți ce proces, sesiune sau procedură le-a creat. Vă vom ajuta puțin mai târziu. Cel mai important, sunt mai sigure decât o tabelă temporară globală, întrucât numai procesul proprietar o poate vedea.
O altă ciudățenie a tabelei temporare locale (și a procedurii stocate temporar locale) este că are un nume diferit în metadatele celei pe care le dați în rutina sau lotul dvs. Dacă aceeași rutină este executată simultan de mai multe procese, Motorul de baze de date trebuie să fie capabil să facă distincția între tabelele temporare locale cu nume identice create de diferitele procese. Face acest lucru prin adăugarea unui șir numeric la fiecare nume de tabel temporar local, căptușit la stânga de caractere de subliniere. Deși specificați numele scurt, cum ar fi #MyTempTable
, ceea ce este stocat de fapt în TempDB este alcătuit din numele tabelului specificat în declarația CREATE TABLE
și sufixul. Datorită acestui sufix, numele tabelelor temporare locale trebuie să aibă 116 caractere sau mai puțin.
Dacă sunteți interesat să vedeți ce se întâmplă, puteți vizualiza tabelele în TempDB la fel ca oricare altul masa. Puteți folosi chiar sp_help
lucru pe tabele temporare numai dacă le invocați din TempDB.
1
2
3
|
USE TempDB
go
executați sp_Help #mytemp
|
sau le puteți găsi în vizualizările de sistem ale TempDB fără a schimba bazele de date.
1
|
SELECT nume, create_dATE FROM TempDB.sys.tables WHERE nume LIKE „#%”
|
Sau schema de informații
1
|
SELECT * FRO M TempDB.information_schema.tables
|
Chiar mai bine, puteți aflați ce proces și ce utilizator se menține la tabele temporare enorme în TempDB și refuză să renunțe la spațiu
Nu puteți utiliza tipuri de date definite de utilizator în tabele temporare decât dacă tipurile de date există în TempDB; adică, cu excepția cazului în care tipurile de date au fost create în mod explicit
Tabelele utilizatorului în TempDB
În utilizare normală, veți crea tabele temporare sau variabile de tabel fără să vă gândiți prea profund la asta. Cu toate acestea, este interesant, totuși, că TempDB este acolo pentru orice fel de activitate sandbox. Puteți crea tabele de bază obișnuite, vizualizări sau orice altceva doriți. Puteți crea scheme, proceduri stocate și așa mai departe. Este puțin probabil să doriți să faceți acest lucru, dar este cu siguranță posibil, deoarece TempDB este doar o altă bază de date. Tocmai a trebuit să-mi repornesc dezvoltarea SQL Server după ce mi-am dovedit acest lucru instalând AdventureWorks pe el. Aceasta înseamnă că este posibil să creați o tabelă de bază în TempDB, un fel de ..er … tabel permanent temporar. Spre deosebire de masa temporară globală, ar trebui să faceți toate propriile servicii de menaj pe ea: sunteți pe cont propriu. Același lucru este valabil și pentru rutine. Avantajul de a face acest lucru este că orice procesare pe care o faceți utilizează recuperarea simplă a TempDB, astfel încât, dacă nu reușiți să curățați, SQL Server acționează ca mamă la următoarea pornire: deși aceasta ar putea fi o perioadă foarte lungă de timp. Următoarea etapă este de a avea ceea ce eu numesc o masă „temporară persistentă”. În acest tabel, datele în sine sunt volatile când serverul repornește, dar tabelul în sine persistă. Probabil cel mai comun mod de a crea o tabelă temporară persistentă este de a recrea la pornirea unei tabele temporare globale. Acest lucru se poate face automat atunci când toate bazele de date sunt recuperate și mesajul „Recuperarea este finalizată” este înregistrat. Chiar dacă acesta este un „temporar global”, nu este șters când toate conexiunile care îl utilizează au dispărut, deoarece procesul care îl rulează În mod sigur, este mai bine să creați acest tip de tabel de lucru în baza de date care îl folosește, deși, dacă utilizați recuperarea completă, lucrarea temporară va rămâne în jurnal. Puteți, desigur, să creați doar un ordinar în TempDB. Puteți crea aceste tabele „persistente” la pornire definind o procedură stocată în master care creează tabelul temporar global
De ce să folosiți acest tip de tabel hibrid? Există, de exemplu, un număr de tehnici pentru trecerea tabelelor între proceduri prin intermediul tabelelor „persistente” într-un mod multiproces în condiții de siguranță, astfel încât să se efectueze o serie de prelucrări a datelor. Acestea sunt referite la tabele cu cheie de proces (consultați „Cum să partajați datele între procedurile stocate” : Tabel cu cheie de proces de Erland Sommarskog ). Vor ridica inițial sprâncenele oricărui DBA experimentat, dar reprezintă o soluție eficientă și sigură la o problemă perenă, atunci când sunt realizate corect.
Pe lângă tabelele temporare, există și o serie de tipuri de tabele care nu sunt derivate direct din tabelele de bază, cum ar fi tabelele „false” și tabelele derivate: unele dintre acestea sunt atât de trecătoare încât sunt cel mai bine considerate mai degrabă efemere decât temporare. CTE utilizează tabele efemere care sunt „inline” sau „derivate” și nu sunt materializate. BOL se referă la acestea ca „seturi de rezultate denumite temporar”. Ele există doar în cadrul expresiei. Într-un CTE, au avantajul față de tabelele derivate prin faptul că pot fi accesate de mai multe ori.
Tabelul temporar local
Cu tabelul temporar local (nume care încep cu #), ceea ce se întâmplă sub capotă este surprinzător de similar cu variabilele din tabel. Ca și în cazul variabilelor de tabel, tabelele temporare locale sunt private pentru procesul care a creat-o. Prin urmare, ele nu pot fi utilizate în vizualizări și nu puteți asocia declanșatoare cu ele.
Sunt mai ușoare decât variabilele de tabel dacă doriți să utilizați SELECT INTO
pentru a le crea, dar sunt puțin îngrijorat cu privire la utilizarea SELECT INTO
într-un sistem care este probabil să necesite modificări, aș prefera să creez tabelele mele temporare în mod explicit, împreună cu toate constrângerile necesare.
Nu puteți spune cu ușurință ce sesiune sau procedură a creat aceste tabele. Acest lucru se datorează faptului că, dacă aceeași procedură stocată este executată simultan de mai multe procese, Motorul de baze de date trebuie să fie capabil să distingă aceleași tabele create de diferitele procese. Motorul de baze de date face acest lucru prin adăugarea internă a unui sufix numeric căptușit la stânga fiecărui nume de tabel temporar local. Numele complet al unui tabel temporar stocat în vizualizarea sys.objects în TempDB este alcătuit din numele tabelului specificat în instrucțiunea CREATE TABLE
și sufixul numeric generat de sistem. Pentru a permite sufixul, numele tabelului specificat pentru un nume temporar local trebuie să aibă mai puțin de 116 caractere.
Obțineți menaj cu tabele temporare locale; acestea sunt abandonate automat când ies din domeniu, cu excepția cazului în care sunt eliminate în mod explicit folosind DROP TABLE
. Domeniul lor de aplicare este mai generos decât o variabilă de tabel, astfel încât să nu aveți probleme la trimiterea lor în loturi sau în SQL dinamic. Tabelele temporare locale sunt abandonate automat la sfârșitul sesiunii sau procedurii curente. Eliminarea acestuia la sfârșitul procedurii care a creat-o poate provoca zgârierea capului: o tabelă temporară locală care este creată în cadrul unei proceduri sau sesiuni stocate este abandonată când este terminată, astfel încât nu poate fi menționată prin procesul care a numit procedura stocată care a creat tabelul. Cu toate acestea, poate fi menționat prin orice proceduri stocate imbricate executate de procedura stocată care a creat tabelul. Dacă procedura imbricată face referire la o tabelă temporară și există două tabele temporare cu același nume la acel moment, care este tabelul pentru care se soluționează interogarea?
Ca curiozitate, puteți crea și Proceduri stocate temporar local cu același domeniu și durata de viață ca un tabel temporar local. Nu puteți face același lucru pentru alte rutine.
Tabelele temporare globale.
La fel ca tabelele temporare locale, tabelele temporare globale (încep cu ##) sunt abandonate automat la sfârșitul sesiunii care a creat tabelul: Totuși, deoarece tabelele globale nu sunt private pentru procesul care a creat-o, ele trebuie să persiste după aceea până când ultima instrucțiune Transact-SQL care făcea referire activă la tabel în momentul în care sesiunea de creare s-a încheiat a fost executată și blocările sunt abandonate. Oricine are acces la TempDB în momentul în care există aceste tabele globale temporare poate interoga direct, modifica sau renunța la aceste obiecte temporare.
Puteți asocia regulile, valorile implicite și indexurile cu tabelele temporare, dar nu puteți crea vizualizări. pe tabele temporare sau asociați declanșatoare cu acestea. Puteți utiliza un tip de date definit de utilizator atunci când creați un tabel temporar numai dacă tipul de date există în TempDB
Procedurile stocate pot face referință la tabelele temporare create în timpul sesiunii curente. În cadrul unei proceduri stocate, nu puteți crea un tabel temporar, lăsați-l și apoi creați un nou tabel temporar cu același nume.
Deși funcționează …
… asta nu t
1
2
3
4
5
6
7
8
9
10
11
12
|
CREAȚI PROCEDURA Comportament necorespunzătorCuTabeleleTemporare AS
CREATE table #Color (
Color varchar (10) cheie PRIMARIA)
INSERT INTO #color SELECT „Red” UNION SELECT „White”
UNION SELECT „verde „UNION SELECT” Galben „UNION SELECT” albastru „
DROP TABLE #color
CREATE table #Color (
Color varchar (10) tasta PRIMARY)
INSERT INTO #color SELECT „Red” UNION SELECT „White”
UNION SELECT „verde „UNION SELECT” Galben „UNION SELECT” albastru „
TABEL DE DROP #color
go
|
Puteți, folosind tabele temporare locale, forța neintenționată recompilarea pe procedura stocată de fiecare dată când este utilizată. Acest lucru nu este bun, deoarece este puțin probabil ca procedura stocată să funcționeze bine. Pentru a evita recompilarea, evitați să vă referiți la un tabel temporar creat într-un apel sau procedură stocată apelată: Dacă nu puteți face acest lucru, atunci puneți referința într-un șir care este apoi executat folosind EXECUTE
declarație sau sp_ExecuteSQL
procedură stocată. De asemenea, asigurați-vă că tabela temporară este creată în procedura stocată sau declanșare înainte de a fi referențiată și abandonată după aceste referințe.Nu creați un tabel temporar într-o instrucțiune de control al fluxului, cum ar fi IF... ELSE
sau WHILE
.
Aveți permisiunea de a crea proceduri globale stocate temporar, dar încă nu am găsit o utilizare pentru ele. Funcțiile temporare globale nu sunt permise.
Concluzii
În orice loc de joacă comun, fiți foarte atenți la modul în care vă balansați liliacul respectiv. Veți fi realizat, în timp ce citiți acest lucru, că o mulțime de activitate se desfășoară în TempDB și puteți provoca ravagii în întregul SQL Server utilizând procese de lungă durată care umple tabele temporare, indiferent de tipul lor, cu cantități inutile de date. De fapt, v-am dat indicii în acest articol despre cum să vă supărați cu adevărat DBA prin utilizarea neconsiderată a acelei resurse comune prețioase, TempDB. (În vremurile de dinainte de S2005, folosirea SELECT INTO
cu o masă uriașă era marea armă V (Vergeltungswaffe)
Sunt întotdeauna îngrijorat să vă sfaturi generalizate, dar prefer întotdeauna bazele mele de date să folosească variabile de tabel și TVP ori de câte ori este posibil, au nevoie de mai puține resurse și este mai puțin probabil să le păstrați când ați terminat cu ele. Îmi place să le folosesc la maxim , cu verificări și constrângeri ale coloanelor și tabelelor. Puteți găsi momente în care acestea rămân fără abur, mai ales când dimensiunile tabelelor devin mai mari. În astfel de cazuri sau în care nu este practic să folosiți variabile de tabel din cauza domeniului lor restrâns Voi folosi tabele temporare locale. Este nevoie de o mulțime de buze strânse și scuturare a capului înainte de a fi de acord cu o masă temporară globală sau cu o masă temporară persistentă. Au câteva utilizări valide și perfect rezonabile, dar se bazează pe programator să facă menajele necesare