Testa tabulas izveide:
Create Table dbo.TestTableIzveidotā 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.
(
RindasNumurs int,
Fiksets char(100),
Mainigs varchar(500)
)
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Š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).
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
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 *Pēc šī vaicājuma izpildes rezultātiem var pārliecināties, ka forwarded_record_count = 0.
FROM sys.dm_db_index_physical_stats (DB_ID(), object_id('TestTable'), NULL, NULL, 'DETAILED')
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)Atkārtoti izpildot indeksa statistikas vaicājumu, var pārliecināties, ka forwarded_record_count = 0 (joprojām).
Where RindasNumurs = 15
Iztīram tabulu no datiem:
truncate table TestTable2. 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 intTabulā 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"):
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
Update TestTable Set Mainigs = Replicate('x', 500)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.
Where RindasNumurs = 15
Savukārt atkārtoti samazinot rindas izmēru:
Update TestTable Set Mainigs = nullun 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š.
Where RindasNumurs = 15
Pēc piemēru izpildes tabulu var izdzēst:
drop table dbo.TestTable
Nav komentāru:
Ierakstīt komentāru