Simplificați întreținerea bazelor de date utilizând tabele partiționate

În trecut, administratorii de baze de date, gestionând tabele cu milioane de rânduri de date, trebuiau să creeze mai multe tabele. Prin împărțirea tabelelor, administratorul a trebuit să se lege

aceste tabele unul altuia în timpul executării multor solicitări. Legarea secțiunilor între ele a necesitat crearea unei vizualizări partajate sau a unei proceduri stocate care a împachetat datele și a efectuat o altă procedură stocată care a funcționat numai cu secțiunile necesare pentru a returna setul de date.

Deși aceste metode au făcut posibilă obținerea rezultatului dorit, au fost foarte împovărătoare. Administrarea mai multor tabele și a indicilor acestora, precum și metodele folosite pentru a reloca tabelele, au devenit adesea o sursă de dificultate în administrare și întreținere. În plus, crearea mai multor tabele pentru a partiție de date a dus la o lipsă de flexibilitate, la fel ca în procedurile stocate, sarcini, servicii, sarcini, Transformation Services (DTS), codul de aplicare și alte procese au trebuit să țină seama de natura peretelui despărțitor. Prin urmare, pentru a permite adăugarea sau reseta kvazisektsy fără astfel de elemente de cod este creat în mod tipic moduri nondynamical și, prin urmare, au o eficiență scăzută de modificare.

Astfel, puteți să creați mai multe secțiuni, să le mutați, să resetați secțiunile vechi și chiar să schimbați modul în care datele sunt împărțite fără să faceți nicio modificare a codului aplicației. Codul aplicației continuă să acceseze aceeași bază de bază sau același nume de index. Acest lucru vă permite, de asemenea, să reduceți cantitatea de date stocate în indici individuali, ceea ce, la rândul său, reduce timpul de întreținere al acestor indici. În plus, puteți încărca datele în secțiuni goale, ceea ce vă permite să măriți viteza de încărcare a datelor.

Crearea de tabele partiționate

Pentru a crea o tabelă capabilă să crească în dimensiune și să utilizeze secțiuni suplimentare în afara celor originale, sunt utilizate funcțiile de partiționare și schemele de partiționare. Aceste obiecte vă permit să separați datele în anumite segmente și să gestionați locația lor în cadrul designului de stocare. De exemplu, puteți distribui date pe mai multe rețele de discuri, în funcție de vârsta datelor sau alte caracteristici distinctive. Trebuie remarcat faptul că tabelul poate fi împărțit de una dintre coloanele sale, iar fiecare secțiune trebuie să conțină date care nu pot fi plasate în alte secțiuni.

Funcțiile de partiționare. Când divizați o masă, trebuie mai întâi să determinați principiul prin care datele vor fi împărțite în segmente. Pentru a compara liniile individuale de date cu segmente diferite, utilizați funcția de partiție. Liniile de date pot fi comparate pe o coloană de orice tip, cu excepția următoarelor: text, ntext, imagine, XML, marcaj de timp, varchar (max), nvarchar (max), VARBINARY (max), tipurile de date alias-uri și tipuri de date definite de utilizator mediu CLR. Cu toate acestea, funcția de partiție trebuie să plaseze șirul de date într-o singură secțiune a tabelului; cu alte cuvinte, ca urmare a aplicării funcției, același rând nu poate aparține mai multor secțiuni în același timp.

Pentru a partiționa o tabelă, trebuie să creați o coloană de partiționare în ea. Această coloană de partiționare poate fi creată în schema de tabele în momentul creării tabelului sau adăugată ulterior prin modificarea tabelului. Coloana poate lua valori NULL, dar toate rândurile care conțin valori NULL vor fi plasate în mod prestabilit în secțiunea din stânga a tabelului. Acest lucru poate fi evitat prin specificarea, atunci când se creează funcția de partiție, că valorile NULL trebuie plasate în secțiunea din partea dreaptă a tabelului. Selectarea secțiunilor din stânga sau din dreapta este o decizie importantă de proiectare, manifestată prin schimbarea schemei de partiționare, adăugarea secțiunilor suplimentare sau ștergerea celor existente.

Când creați o funcție de partiție, puteți selecta funcțiile de stânga sau spre dreapta. Diferența dintre stânga și dreapta este secțiuni în cazul în care o schemă de partiționare va fi plasat valori limită. Atunci când se utilizează secțiuni de (această opțiune este selectată implicit), valoarea limită este inclusă în secțiunea, în timp ce utilizarea secțiunilor situate valoare limită DREAPTA în secțiunea următoare.

Pentru a înțelege mai bine acest principiu, luați în considerare următoarele exemple de secțiuni LEFT și RIGHT:

În prima funcție (Left_Partition), valorile 1, 10 și 100 sunt plasate în prima, a doua și a treia secțiune. În a doua funcție (Right_Partition), aceste valori sunt plasate în secțiunile a doua, a treia și a patra.

Atunci când creați o tabelă partiționată, este important ca secțiunile să fie cât mai egale. Acest lucru vă va ajuta să înțelegeți cât spațiu este necesar pentru fiecare secțiune. Utilizarea parametrilor LEFT și RIGHT determină locul unde vor fi plasate datele, ceea ce determină, la rândul lor, dimensiunea secțiunii și dimensiunile indexurilor create pe aceasta.

Determinați numărul secțiunii în care se încadrează o anumită valoare, utilizând funcția $ PARTITION, după cum se arată mai jos:

Prima instrucțiune SELECT returnează o valoare de 2, a doua - o valoare de 3.

Sisteme de separare. După crearea funcției și selectarea metodei de partajare a datelor între secțiuni, este necesar să se decidă unde vor fi create secțiunile separate în subsistemul disc. Schemele de partiționare sunt utilizate pentru a crea această structură a discului. Schemele de partiționare controlează modul în care secțiunile individuale sunt stocate pe disc, utilizând grupuri de fișiere pentru a găzdui fiecare partiție pe subsistemul discului. Schemele de partiționare pot fi configurate astfel încât toate secțiunile să fie amplasate într-un singur grup de fișiere, astfel încât fiecare secțiune să fie localizată în grupul de fișiere sau mai multe secțiuni să utilizeze grupuri de fișiere comune. Ultima metodă oferă administratorului bazei de date o gamă largă de posibilități de dispersare a operațiilor I / O de pe disc.

În Fig. Figura 1 prezintă câteva dintre modalitățile prin care puteți atribui o schemă de partiții unui sau mai multor grupuri de fișiere. Trebuie reținut faptul că grupurile de fișiere utilizate de schema de partiționare trebuie să existe în baza de date înainte de a crea schema.

Dacă creați șabloanele funcțiilor de partiție prezentate în Fig. 1. și utilizați această schemă de partiționare pentru a crea o tabelă, puteți stabili unde vor fi plasate rândurile individuale de date în tabelele partiționate. Acest lucru vă va permite să vizualizați mai târziu distribuția liniilor de date introduse într-o tabelă partiționată. Furnizarea acestui cod va arăta așa cum este arătat în Fig. 2.

Schimbarea tabelelor partiționate

În ciuda unei planificări atente, uneori trebuie să faceți modificări în tabelele partiționate după ce acestea sunt create și completate cu date. Schema de partiționare poate funcționa conform destinației, dar administratorul bazei de date poate, de exemplu, să adauge noi secțiuni atunci când se acumulează date noi sau poate fi necesar să resetați un număr mare de date partiționate simultan. Din fericire, tabelele partiționate și structurile de partiționare de bază vă permit să efectuați modificări după ce tabela este pusă în funcțiune și completă cu date.

Adăugarea secțiunilor. Multe planuri de partiționare includ posibilitatea de a adăuga secțiuni noi în viitor. Acest timp poate fi specificat la o anumită dată sau depinde de valoarea din coloana identificatorilor incrementali. Cu toate acestea, dacă adăugarea de noi secțiuni la masa partiționată nu a fost planificată în avans, se poate face oricând. Luați în considerare tabelul, a cărui creare este prezentată în Fig. 2. Adăugați o secțiune nouă, care va conține valori mai mari de 500, poate fi după cum urmează:

Abilitatea de a adăuga noi secțiuni oferă flexibilitate ridicată. În Fig. 3 arată cum se adaugă o secțiune în partea stângă a funcției. În acest caz, este necesar să se determine în schema de partiționare unde noua secțiune va fi localizată, deoarece toate grupurile de fișiere create atunci când schema de partiționare a fost construită pentru prima dată au fost deja epuizate. Deși grupul de fișiere PRIMARY este folosit pentru toate secțiunile, este necesar să se definească în mod explicit în schema de partiționare că acest grup de fișiere ar trebui să fie de asemenea utilizat pentru noua secțiune.

Îmbinarea a două secțiuni. Serverul SQL Server vă permite să abandonați secțiuni individuale din tabel în timp ce salvați date. În acest fel, puteți îmbina datele vechi vechi cu date arhivate sau puteți reduce numărul de partiții disponibile pentru a simplifica administrarea unei tabele partiționate. Folosind secțiunile de îmbinare, puteți muta de asemenea date dintr-un grup de fișiere în altul pentru a elibera spațiu pe anumite discuri. În codul de program din Fig. Figura 4 arată cum puteți să mutați date dintr-o secțiune în alta în același grup de fișiere.

Mutarea unei secțiuni de la o masă la alta. O sarcină tipică de administrare este mutarea datelor vechi în tabele separate de arhivă. Procesul de arhivare necesită de obicei o serie de instrucțiuni care conduc la un consum suplimentar de resurse în jurnalele de tranzacții. Pentru a arhiva cu ușurință o cantitate mare de date fără costuri suplimentare asociate cu jurnalul de tranzacții, puteți utiliza traducerea unei secțiuni dintr-o tabelă în alta. Această caracteristică permite administratorului bazei de date să mute segmentele de date vechi de la tabelele active la cele arhivate. Întrucât datele în sine nu se mișcă în acest fel, această metodă necesită mult mai puțin timp decât atunci când se deplasează rândurile de date unul câte unul. În Fig. 6 arată cum puteți face acest lucru.

Utilizați o singură secțiune pentru a crea o tabelă nouă. O singură secțiune poate fi mutată dintr-o tabelă partiționată existentă într-o tabelă goală, nepartimentată. Ca urmare, administratorul bazei de date poate efectua întreținerea de indexuri pe această singură secțiune sau este ușor să resetați o cantitate mare de date fără a fi nevoie să înregistrați procesul de ștergere în jurnal. În Fig. 7 arată cum să mutați o secțiune într-o tabelă goală și apoi să resetați datele cu acest nou tabel.

Împreună cu capacitatea de a diviza datele de tabel, devine posibilă crearea de indici partiționați. Acest lucru permite administratorului bazei de date să proiecteze o structură index pe baza datelor divizate, nu pe baza tuturor datelor din tabel. Crearea de indici partiționați presupune crearea copacilor echilibrați separați pe indici partiționați. Ca urmare a împărțirii indexurilor, se creează indexuri mai mici, iar manipulatorul de stocare devine mai ușor să le mențină în timp ce modifică, adaugă și șterg datele. Administratorul bazei de date poate, de asemenea, să difuzeze separat aceste indexuri reduse, ceea ce face posibilă servirea mai eficientă a indexurilor pe seturi de date mari.

Creați indexuri partajați. Atunci când creați indexuri partiționate, puteți crea indexuri aliniate sau nealiniate. Indicii aliniate presupun o legătură directă cu datele partiționate. (În cazul indexurilor nealiniate, este selectată o altă schemă de partiționare.)

Dintre aceste două metode este preferat un indice aliniat, care este selectat automat dacă, după crearea tabelei partiționate, indiciile sunt create fără a specifica o altă schemă de partiționare. Utilizarea indexurilor aliniate oferă flexibilitatea necesară pentru a crea secțiuni suplimentare în tabel și, de asemenea, vă permite să traduceți apartenența unei secțiuni la alt tabel. Disponibilitatea acestor funcții este principalul motiv pentru care administratorii bazei de date creează simultan tabelele partiționate. Pentru a rezolva majoritatea problemelor asociate partiționării, este suficient să folosiți schema de partiționare a tabelelor pentru indexuri.

Indicii de pe tabele pot fi create astfel încât datele din index să nu fie aliniate cu datele din tabel. Dacă datele sunt stocate într-o tabelă partiționată, acest lucru permite ca datele să se unească în diferite moduri (datele partiționate se pot conecta eficient la alte date partiționate utilizând optimizatorul de interogări). Alternativ, puteți face acest lucru cu un tabel neegmentat, care va crea un index partiționat (pe un tabel cu o singură secțiune) pentru a simplifica menținerea indexului.

Codul programului din Fig. 8 creează un index partiționat nonclustered pe o tabelă partiționată. Indicele nonclustered este aliniat la tabel; ca cheie indice nonclustered, se folosește coloana de partiționare a tabelului.

Codul programului din Fig. 9 creează un indice non-alocat nealiniat pe o tabelă partiționată. În acest index nonclustered, diferite coloane sunt utilizate ca cheie index; Această cheie poate fi utilizată în combinațiile ordonate cu alte tabele partiționate.

Trebuie remarcat faptul că întreținerea indexului pentru secțiunile cu un index trebuie efectuată într-un mod offline, astfel încât poate provoca blocarea tabelului în timpul întreținerii indexului. Pentru a evita acest lucru, mutați secțiunea unității într-o secțiune separată, efectuați întreținerea indexului, apoi mutați secțiunea înapoi la masa principală. Acest proces va cauza o degradare a performanței în timpul relocării secțiunii la masă și actualizarea indexului cluster, dar acest lucru duce la mai puține dificultăți decât blocarea întregului tabel și necesită mai puține resurse de sistem.

concluzie