pirmdiena, 2010. gada 11. oktobris

Piemērs: pāredresētie ieraksti (Forwarded records)

Piemērā tiek ilustrēta tabula bez indeksiem un parādīts kas notiek datu mainīšanas gadījumos.

Testa tabulas izveide:
Create Table dbo.TestTable
(
    RindasNumurs int,
    Fiksets char(100),
    Mainigs varchar(500)
)
Izveidotā tabula būs ar trijām kolonām. "Fiksets" kolona vienmēr aizņems 100 baitus, "Mainīgs" kolona var aizņemt līdz 500 baitiem.

1. gadījums- rinda tiek mainīta, tā maina fizisko atrašanās vietu lapā, netiek izmantots pāradresējošais kursors.

Ievietosim tabulā pāris datu rindas:
Declare @rindasNumurs int
Set @rindasNumurs = 1;
While @rindasNumurs < 50
Begin
    Insert Into dbo.TestTable (RindasNumurs, Fiksets, Mainigs)
        Values (@rindasNumurs, 'Vienmēr aizņem 100 zīmes', '123');
    Set @rindasNumurs = @rindasNumurs + 1;
End
Šajā gadījumā tabulā ir ievietotas 49 datu rindiņas. Lapā, kurā dati ievietoti vēl paliek samērā daudz vietas (aptuveni padsmit datu rindām, jeb vismaz 1000 baiti- ja ir vēlme, var izrēķināt precīzi).

Izpildot indeksa statistikas vaicājumu (šis vaicājums būs vēlāk jāizpilda atkārtoti, lai pārliecinātos par citu vaicājumu efektu. Nevajadzētu arī samulst, ka vaicājums saucas "indeksa statistikas vaicājums"- tas nekādā veidā nenozīmē to, ka tabulai būtu uzlikts indeks):
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID(), object_id('TestTable'), NULL, NULL, 'DETAILED')
Pēc šī vaicājuma izpildes rezultātiem var pārliecināties, ka forwarded_record_count = 0.
Palielinot rindas garumu, ņemot vērā rakstā "Tabula bez klusterētā (clustered) indeksa" aprakstīto- rinda paliks tajā pašā lapā un netiks izmantots pāradresējošais rādītājs.
Lai to pārbaudītu izpildam datu mainīšanas vaicājumu:
Update TestTable Set Mainigs = Replicate('x', 500)
    Where RindasNumurs = 15
Atkārtoti izpildot indeksa statistikas vaicājumu, var pārliecināties, ka forwarded_record_count = 0 (joprojām).
Iztīram tabulu no datiem:
truncate table TestTable
2. gadījums- rinda tiek mainīta, tā maina fizisko atrašanās vietu uz citu lapu, tiek izmantots pāradresējošais kursors.

Piepildam tabulu ar datiem (pirms tam tabula jāiztīra ar truncate table, ja pildīts iepriekšējais piemērs):
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
Tabulā ievietoti dati tā, lai tie aizņemtu precīzi vienu lapu- lapa ir praktiski pilna (96% aizpildīti- var pārliecināties ar iepriekš doto indeksa statistikas vaicājumu). lai pārliecinātos par pāradresējošā kursora rašanos, palielināsim vienu rindu tā, lai tā nevarētu ietilpt šajā lapā (vizuāli situācija redzama rakstā "Tabula bez klusterētā (clustered) indeksa"):
Update TestTable Set Mainigs = Replicate('x', 500)
    Where RindasNumurs = 15
Pēc vaicājuma izpildes, tabulai tika atvēlēta vēl viena lapa, kurā tika ievietots mainītais ieraksts. Orģinālajā lapā ieraksts tika mainīts tā, ka tam ir pāradresējošais kursors. Izpildot iepriekš doto indeksa statistikas vaicājumu, var pārliecināties, ka forwarded_record_count = 1.
Savukārt atkārtoti samazinot rindas izmēru:
Update TestTable Set Mainigs = null
    Where RindasNumurs = 15
un atkārtoti izpildot indeksa statistikas vaicājumu, var pārliecināties, ka forwarded_record_count = 0- tātad, ieraksts ir atgriezies lapā, kurā tas bija iepriekš.

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

Nav komentāru:

Ierakstīt komentāru