otrdiena, 2010. gada 19. oktobris

Piemērs: Lapu dalīšanās (Page splits)

Piemērā tiek ilustrēta tabula ar klusterēto (clustered) indeksu un parādīts gadījums, kad notiek lapu dalīšanās datu mainīšanas rezultātā.



Testa tabulas izveide:
Create Table dbo.TestTable
(
    RindasNumurs int primary key,
    Fiksets char(100),
    Mainigs varchar(500)
)
Līdzīgi kā iepriekš ("Piemērs: pāredresētie ieraksti (Forwarded records)"), Izveidotā tabula būs ar trijām kolonām. "Fiksets" kolona vienmēr aizņems 100 baitus, "Mainigs" kolona var aizņemt līdz 500 baitiem.
Savukārt būtiskā atšķirība ir tā, ka rindas numuram papildus norādīts "primary key", kas nozīmē, ka tabulai tiek automātiski izveidots klusterēts indekss.

Aizpildīsim tabulu ar datiem, tā lai būtu gandrīz pilnībā aizpildīta viena lapa (ņemot vērā rindas garumu, lapu aizpildīt 100% nevar, jo viena rinda netiek dalīta daļās).
Declare @rindasNumurs int
Set @rindasNumurs = 1;
While @rindasNumurs < 66
Begin
    Insert Into dbo.TestTable (RindasNumurs, Fiksets, Mainigs)
        Values (@rindasNumurs, 'Vienmēr aizņem 100 zīmes', '123');
    Set @rindasNumurs = @rindasNumurs + 1;
End
Tāpat kā iepriekš, izpildīsim indeksu statistikas vaicājumu:
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID(), object_id('TestTable'), NULL, NULL, 'DETAILED')
Apskatot rezultātus, uzmanību jāpievērš šādiem lielumiem:
index_depth = 1, kas nozīmē indeksa dziļumu- ir jāpārmeklē tikai viena lapa, lai nokļūtu no indeksa sākuma līdz datiem;
avg_page_space_used_in_percent = 96.34, kas nozīmē, ka lapa ir par 96% aizpildīta ar datiem;
forwarded_record_count = Null, kas nozīmē, ka nav neviena pāradresējošā ieraksta.

Izpildot datu mainīšanas vaicājumu:
Update TestTable Set Mainigs = Replicate('x', 500)
    Where RindasNumurs = 15
Pēc datu mainīšanas izpildot indeksu statistikas vaicājumu, tiks atgrieztas divas rindas (katram līmenim indeksā viena rinda). Mums šobrīd interesē rinda ar index_level = 1, tātad tas indeksa līmenis, kurā glabājas dati.

Apskatot tos pašus lielumus ko iepriekš mēs iegūstam šādu informāciju:
index_depth = 2, tātad, indeks ir divos līmeņos. 1.līmeņa indeksa lapa sadala datus divās daļās (indeksa 1.līmenī glabājas tik atslēgas vērtību rindu, cik lapu ir indeksa nākamajā līmenī, līdz ar to lai iegūtu indeksu ar jau 3. līmeņiem ir nepieciešams daudz, daudz vairāk datu rindu)
avg_page_space_used_in_percent = 51.23, kas nozīmē, ka abas lapas ir par 51% aizpildīta ar datiem- tātad, ir notikusi lapas dalīšanās. un kā aprakstīts rakstā "Tabulas ar klusterētu (clustered) indeksu", dati no vienas lapas ir aptuveni vienmērīgi sadalīti divās daļās;
forwarded_record_count = Null, kas nozīmē, ka nav neviena pāradresējošā ieraksta. Pāradresējošie ieraksti var rasties tikai gadījumā, ja tabula nav fiziski sakārtota- tātad tai nav klusterētā indeksa.

Pēc piemēru izpildes tabulu var izdzēst:
drop table dbo.TestTable

Nav komentāru:

Komentāra publicēšana