ceturtdiena, 2010. gada 30. septembris

Datu glabāšana SQL Server

Rakstā tiek pārskriets pāri SQL Server datu glabāšanas struktūrām, sniedzot atsauces uz papildus materiāliem padziļinātai informācijas iegūšanai. Šis raksts ir kā pamats vairākiem turpmāk plānotajiem rakstiem.

Datu glabāšana SQL Server

Datu bāzes faili
Katra datu bāze sastāv vismaz no diviem failiem- primārā datu faila un log faila. Primārais datu fails glabā visu datu bāzes informāciju. Log fails glabā informāciju, ko var izmantot lai “glābtu” datu bāzi, ja rodas tāda vajadzība. Papildus šiem diviem failiem var tikt veidoti vēl sekundārie datu bāzes faili (viens vai vairāki) un papildus Log faili. Paplidus var palasīt šeit.

Lapas (Pages) (Paralēli lasot par lapām un Extents, vēlams atvērt bildes no šejienes)
Datu bāze (=datu bāzes fails) sastāv no lapām (pages), katra no kurām ir 8 KB liela. To izmēru nevar mainīt un vienmēr katra nolsaīšanas/ierakstīšanas operācija notiek lapu līmenī (tātad- 8 KB). Vienā lapā var atrasties tikai viens objekts (piemēram, tabula, indekss un citi). Piemēram, izveidojot tabulu tā atradīsies vienā lapā pat tad, ja tās izmērs būs daudz mazāks par 8 KB. Citi objekti šajā lapā neatradīsies.
Ir vairāku veidu lapas, bet visvairāk interesē tieši lapas, kurās glabājas tabulas informācija. Lapas, kurās glabājas tabulu dati, uzbūve ir
- lapas galvenē ir informācija par lapu- atsauces uz nākamo un iepriekšējo lapu (ja tādas ir), brīvās vietas daudzums lapā (..);
- dati (datu rindas- par to mazliet vēlāk) ;
- lapas beigās ir saraksts, kurā norādīts cik tālu no lapas sākuma sākās katra rinda. (optimizācijas nolūkiem).
Vairāk par lapām var palasīt šeit

Vizuāli datu lapas varētu attēlot šādi:

Extents (8 pages = 64 KB, vārdu ‘Extent’ neriskēju tulkot latviski- ļoti atvainojos)
Šī ir nākamā struktūra, kas tiek izmantota MS SQL Server. Extent ir struktūra, kas sastāv no 8 lapām. No tā izriet, ka vienā Extent var būt līdz 8 objektiem (kā minēts iepriekš- vienā lapā var būt ne vairāk kā viens objekts).
Ir divu veidu Extents- viendabīgi (Viss Extent, tātad- 8 lapas, rezervētas vienam objektam) un kombinēti (katra no 8 lapām var piederēt citam objektam). Kamēr objekts ir mazāks par 8 lapām (<64 KB informācijas), tas atradīsies kombinētā Extent. Savukārt pārsniedzot 8 lapu barjeru, katrs nākamais solis datu rezervēšanā būs vesels Extent. Tātad, kamēr tukšā tabulā ievieto datus tā aug ar soli 8KB (protams, kad 8KB ir aizņemti) kamēr tiek līdz 64KB (8 lapas) robežai. Pēc tam jau solis ir 64KB.

Datu rindas
Galvenais ko aprakstot datu rindas vēlos šeit pateikt ir tas, ka rindas garums nav vienāds col_1 garums + col_2 garums + .. + col_N garums. Papildus datiem datu rindā tiek glabāta tāda informācija kā rindas garums, null kolonnu skaits, fiksēta izmēra datu garums un cita informācija. (Par datu rindu uzbūvi vienīgais materiāls ko esmu lasījis ir SQL Server 2000 grāmatā, SQL Server 2008 spriežot pēc informācijas kam uzskrēju blogā, katrai rindai nākot vēl papildus 20 baiti informācija klāt. Diemžēl pagaidām neizdodas atrast smalkāku aprakstu un arī pārbaudīt vai tiešām tā ir.)

Vienkāršojot, datu rindas zīmēšu šādi (zaļganajā krāsā informācija par rindu, baltā- rindas dati):

Lapas atmiņas vadībai
Katrā datu bāzes failā ir speciālas lapas atmiņas vadībai. Ir vairāki šo lapu tipi un tie būtu:
* Global Allocation Map (GAM) lapas- satu inofrmāciju par to, kuri Extenti šobrīd ir rezervēti (tātad- nav svarīgi cik pilns ir Extent, dod informāciju vai tas jau tiek lietots). Viena šāda lapa sniedz informāciju par 4GB atmiņas.
* Secondary Global Allocation Map (SGAM) lapas- Informācija par to, kurā Extent ir brīva lapa, kurā var glabāt informāciju (ja viss Extent ir rezervēts tikai vienai tabulai, tad tādā Extent attiecīgais bits būs 0, savukārt kombinētie Extent ar brīvām lapām attiecīgais bits būs 1)
* Index Allocation Map (IAM) lapas- Katrai tabulai vai indeksam ir vismaz viena IAM lapa. Šīs lapas satur inromāciju par to, kuras lapas/Extents pieder attiecīgajai tabulai vai inteksam. Šīs lapas būs svarīgas vēlāk aprakstot tabulas datu glabāšanas struktūru. Vairāk par tām var palasīt:
IAM SQL Server 2000 (šajā ziņā nekas nav mainījies arī SQL 2005)
IAM SQL Server 2005
* Page Free Space (PFS) lapas- Satur inromāciju par to, vai lapa ir rezervēta tabulai, indeksam vai kādam citam objektam. Papildus tam, šajā lapā tiek glabāta informācija par to, cik pilna ir katra no lapām (vienā PFS tiek glabāta informācija par 8000 lapām). Katras lapas “Pilnums” tiek iedalīts šādās iedaļās- tukša, 1-50% aizņemta, 51-80% aizņemta, 81-95% aizņemta un visbeidzot 96-100% aizņemta.
Papildus par lapām atmiņas vadībai var atrast šeit.

Datu bāzes datu faila sākums izskatās šādi (avots):
File header(1.lapa), PFS(2.lapa), GAM,(3.lapa) SGAM(4.lapa).

Kopsavilkums
Subjektīvi- šobrīd galvenais, kam būtu jāpaliek atmiņā ir tas, ka visa datu bāze sastāv no 8 KB lapām. Dažas no tām tiek izmantotas lai optimizētu darbu (piemēram, lai paātrinātu procesu kā atrast brīvu vietu kurā var rakstīt datus), citas savukārt tiek izmantotas tabulas datu glabāšanai. Datu glabāšanas lapām ir vairāki speciālgadījumi. Datu lapas tiek grupētas Extents, ar mērķi efektīvāk strādāt ar atmiņas apgabaliem.

Papildus literatūra
Oracle un SQL Server datu struktūru salīdzinājums šeit

Nav komentāru:

Ierakstīt komentāru