SQL Server’da Bir Kaydın Fiziksel Konumunu Bulma

By | May 17, 2013

Merhaba,

Bu makalemde undocumented komut ve fonksiyonlar yardımıyla SQL Server’da bir tablodaki bir kayıt satırının fiziksel konumunu nasıl bulunacağını ve fiziksel konumdan nasıl okunacağını aktaracağım.

SQL Server veritabanı sisteminde her bir kayıt için kayıtın tutulduğu file_id (dosya numarası), page_id(sayfa numarası) ve slot_id(slot numarası) üçlüsünden oluşan RID(Row ID) bilgisi tutulmaktadır. Bu bilgiye SQL Server 2005 ile birlikte gelen %%lockres%% komutu ile ulaşabiliyorduk.Bazı zamanlarda hata kodlarında görüntülediğimiz kodlara benzerdir elde edeceğimiz sonuç ve şimdi ise Satırın bulunduğu fiziksel konumu bulmak için bir test veritabanı ve test tablosu oluşturalım:

create database test_dbcc
go
use test_dbcc
go

create table dbo.WebSites
(id int identity(1,1),
webadress varchar(64),
siteowner varchar(32))
go
insert into dbo.WebSites(webadress,siteowner) values('www.caglarozenc.com','Çağlar Özenç')
go
insert into dbo.WebSites(webadress,siteowner) values('www.caglarozenc.com','Çağlar Özenç')
go

Oluşturduğumuz tablodaki kayıtların fiziksel konumuna bakalım:

select id, webadress, %%lockres%% FileId_PageId_SlotId
from dbo.WebSites

r1

Yukarıdaki resimde; en sağdaki sütun bize ilgili kayıtın bulunduğu file_id, page_id ve slot_id numarasını vermektedir. 1. Satır için file_id 1, page_id 120 ve slot_id 0 değerlerine sahip.
SQL Server 2008 ile birlikte %%lockres%% komutuna benzer işi yapan %%physloc%% komutu geldi. %%physloc%% komutu hex değer döndürür. WebSites tablosundaki kayıtların fiziksel adreslerini hex olarak bulalım:

select id, webadress, %%physloc%% HexAdress
from dbo.WebSites

r2

HexAdress kolonun ilk 4 byte’ın kombinasyonu page_id değerini; sonraki 2 byte’ın kombinasyonu file_id değerini; en sondaki 2 byte’ın kombinasyonu ise slot_id değerini verir.
%%physloc%% komutunun döndürdüğü hex değeri kolayca okuyabilmek için undocumented olan sys.fn_PhysLocFormatter() fonksiyonu da kullanılabilir:

select id,webadress, %%physloc%% HexAdress, sys.fn_PhysLocFormatter(%%physloc%%) Adress
from dbo.WebSites

%%physloc%% komutunun döndürdüğü hex değerini okuyabileceğimiz undocumented bir diğer fonksiyonumuz sys.fn_physloccracker() fonksiyonudur. Aynı sorguyu sys.fn_physloccracker() fonksiyonunu kullanarak fiziksel adres bilgilerini bulalım:

select w.id, w.webadress, %%lockres%% HexAdress, plc.file_id, plc.page_id, plc.slot_id
from dbo.WebSites w
cross apply sys.fn_physloccracker(%%physloc%%) plc

r4

Data Page yapısını okumak için dbcc page komutu kullanılır.

dbcc page( {dbid|dbname}, pagenum [,print option] [,cache] [,logical] )

Parametreler:
Dbid|dbname : Veritabanı Id yada Veritabanı Adı
Pagenum : Page numarası
Print option : 0, 1, 2 veya 3 değerini alabilen içerik detayını görüntüleme seçenekleridir. 0 – (Default) : Sadece page header bilgisi için
1 – Page Header ile birlikte her satırın hex bilgisi için
2 – Page Header ve Page seviyesinde detay bilgi için
3 – Page Header ve satır seviyesinde detay bilgi için

Konu için Mehmet Güzel‘in websayfası kullanılmıştır.
Kendisine bilgilendirmesi için teşekkür ederim.

0 thoughts on “SQL Server’da Bir Kaydın Fiziksel Konumunu Bulma

Leave a Reply

Your email address will not be published. Required fields are marked *