czwartek, 30 grudnia 2010

%%physloc%%

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


Brak komentarzy:

Prześlij komentarz