W SQL Server 2008 pojawiła się bardzo ciekawa funkcja %%physloc%% dzięki niej możemy w pseudokolumnie zobaczyć adres fizyczny rekordu.
Robimy sobie poligon
CREATE TABLE test ( id INT IDENTITY (1,1) PRIMARY KEY,
tekst VARCHAR(100),
dtekst VARCHAR(MAX),
data DATETIME)
go
INSERT test(tekst,dtekst,data)
VALUES
('abc','ABC',GETDATE())
go
SELECT %%physloc%%, * FROM test
--------------
id tekst dtekst data
------------------ ----------- ----------------------------------------------------
0x9C50000001000000 1 abc ABC 2010-12-30 13:41:44.673
Dostajemy zahaszowany adres strony, można go rozwiązać przy pomocy funkcji skalarnej sys.fn_PhysLocFormatter lub funkcji tabelarycznej sys.fn_PhysLocCracker
SELECT sys.fn_PhysLocFormatter(%%physloc%%), * FROM test
--------------
id tekst dtekst data
------------------ ----------- ----------------------------------------------------
(1:20636:0) 1 abc ABC 2010-12-30 13:41:44.673
Sprawdzamy
select OBJECT_ID('test'), DB_ID()
----------- ------
2139154666 5
DBCC IND (5,2139154666,0)WITH TABLERESULTS, NO_INFOMSGS
Zgadza się, co będzie jak zwiększymy rozmiar pola
UPDATE test
SET dtekst =dtekst +REPLICATE('qazwsx0987',20000)
Spodziewamy się, że pole dtekst będzie miało 200003 znaki ?
SELECT LEN(dtekst) FROM test
---------------
8003
Taka mała niespodzianka z polem max, ale nie o to nam chodzi
SELECT sys.fn_PhysLocFormatter(%%physloc%%), * FROM test
--------------
id tekst dtekst data
------------------ ----------- ----------------------------------------------------
(1:20636:0) 1 abc ABCqazwsx0987qa<..> 2010-12-30 13:41:44.673
Czyli nadal jedna strona ?
DBCC IND (5,2139154666,1)WITH TABLERESULTS, NO_INFOMSGS
Już są dwie strony danych, została dodana strona typu LOB, funkcja wskazuje tylko stronę początkową. Co będzie jak dodamy następny rekord?
INSERT test (tekst,dtekst,data)
SELECT tekst,dtekst,data FROM test
go
SELECT sys.fn_PhysLocFormatter(%%physloc%%), * FROM test
--------------
id tekst dtekst data
------------------ ----------- ----------------------------------------------------
(1:20636:0) 1 abc ABCqazwsx0987qa<..> 2010-12-30 13:41:44.673
(1:20636:1) 2 abc ABCqazwsx0987qa<..> 2010-12-30 13:44:31.423
Wszystko nadal jest na jednej stronie, tak to wygląda ponieważ na pierwszej stronie znajdują się wskaźniki do strolny LOB. Faktycznie dane znajdują się już na trzech stronach