MSSQL Server DBCC Page Header İçeriği

Bu makalemizde page header içinde tutulan verileri detaylı olarak göreceğiz. SQL Server’da her page’in ilk 96 byte’lık bölümü page header olarak adlandırılır. Page Header ile Row Offset Array arasında kalan bölümde verilerimiz bulunmaktadır.

DBCC PAGE komutunu kullanmak için SQL Server’da sysadmin rolüne sahip olmanız veya yeterli izinlere sahip olmanız gerekir. Ayrıca, bu komut genellikle sorun giderme ve analiz amaçlı kullanıldığından, üretim ortamlarında dikkatli kullanılmalıdır.
Bu komutu çalıştırabilmek için Trace Flag 3604‘ü etkinleştirmelisiniz.

DBCC TRACEON (3604);  -- Çıktıyı SSMS'e yönlendirir

DBCC PAGE komutunun temel sözdizimi aşağıdaki gibidir:

DBCC PAGE ( {'databasename' | databaseid}, fileid, pageid, print_option )

databasename | databaseid: İncelemek istediğiniz veritabanının adı veya kimliği (ID).
 file_id: Sayfanın bulunduğu dosyanın ID’si (sys.master_files tablosundan bulunabilir). Genellikle 1’dir (birincil veri dosyası-mdf).
 page_id: İncelenecek sayfanın ID’si (DBCC IND ile bulunabilir.)
 print_option: Sayfa içeriğinin nasıl görüntüleneceğini belirler. Genellikle 0, 1, 2 veya 3 değerlerini alır:
 0: Genel özet verir.
 1: Sayfanın başlık bilgilerini gösterir.
 2: Veri satırlarını detaylı şekilde gösterir.
 3: Veri satırlarının hexadecimal (hex) görünümünü gösterir.
Şimdi aşağıdaki komutlarla gelen çıktıyı detaylı bir şekilde inceleyelim.

DBCC TRACEON (3604);

DBCC PAGE ('AdventureWorks2014', 1, 12345, 3);

Yukarıdaki ekran resmini detaylı bir şekilde inceleyelim.

FileID = 1 → Genellikle birincil veri dosyasıdır (MDF).
PageID = 12345 → İncelenecek sayfanın ID’si.
Seviye 3 → Ham veriyi hexadecimal formatta gösterir.

DBCC PAGE çıktısı genellikle şu bölümlerden oluşur:

Sayfa Başlığı (Page Header): İlk 96 byte’lık yani 192 hexadecimal karakterlik alan Page Header kısmıdır.
m_pageId: Sayfanın ID’si
m_type: Sayfanın türü
                  1 → Veri Sayfası
                  2 → Index Sayfası
                 10 → IAM Sayfası (Index Allocation Map)
m_slotCnt: Sayfadaki veri satırı sayısı
m_freeCnt: Sayfadaki boş alan miktarı
m_level = 0 → Sayfa leaf (yaprak) seviyesinde, yani indeksin en alt katmanı.
Eğer m_level > 0 olsaydı, index ara katmanında olurdu.

Sayfa Bağlantıları (Page Links)

Bu bölüm, sayfanın önceki ve sonraki sayfalarla bağlantısını gösterir.

 m_prevPage = (1:12344) → Önceki sayfa 12344.
 m_nextPage = (1:12346) → Sonraki sayfa 12346.

Bu sayfa, 12344 ve 12346 arasında bir bağlantı kuruyor. Eğer bu bağlantıda eksiklik veya hatalı referanslar varsa, sayfa bozulmuş olabilir.


 Sayfa İçeriği ve Kullanım Durumu


m_slotCnt = 186

  • Sayfadaki kayıt sayısını belirtir. Her slot bir kayıt yerini gösterir.
  • Bu doğru: Sayfada 186 kayıt var demektir (silinmiş olanlar dahil olabilir).

m_freeCnt = 27

  • Sayfa başındaki boşluk miktarını (header ile slot dizisi arasında kalan alan) gösterir.
  • 27 byte boş alan var demektir. Bu genellikle küçük olur ve normaldir.

m_freeData = 7793

  • Sayfanın orta kısmında (veri alanı içinde) kullanılmayan veri alanını gösterir.
  • 8KB’lık bir sayfada (8192 byte), bu kadar boşluk varsa, aslında sayfa neredeyse tamamen boştur.

m_ghostRecCnt = 0
m_ghostRecCnt = 0 → Silinmiş ancak henüz temizlenmemiş (ghost) kayıt yok.
 Eğer burada bir sayı olsaydı, silinen kayıtlar hala diskte yer kaplıyor olurdu.
 Eğer m_freeData beklenenden büyükse, sayfada kayıp veya eksik veri olabilir.

Sayfanın Tahsis (Allocation) Durumu

Bu bölüm, SQL Server’ın sayfanın nasıl tahsis edildiğini ve nasıl kullanıldığını belirlemek için kullandığı haritalama bilgilerini gösterir.

HaritaGöreviAnlamı
GAM (Global Allocation Map)Bir extent’in (8 sayfalık blok) tahsis edilip edilmediğini gösterir.Eğer “NOT ALLOCATED” diyorsa, bu sayfa resmi olarak tahsis edilmemiş demektir.
SGAM (Shared GAM)Sayfa mixed extent içinde mi, değil mi onu söyler.“NOT ALLOCATED” ise mixed olarak da kullanılmıyor.
DIFFSayfa yedekten sonra değişti mi? Onu gösterir.“NOT CHANGED” = Yedekten beri hiç değişmedi.
ML (Minimal Logging)Sayfa minimal loglama ile mi işlendi?“NOT MIN LOGGED” = Normal loglandı.
PFS (Page Free Space)Sayfa ne kadar dolu?“0x0 QPCTFULL” = Sayfa tamamen boş olabilir veya çok az veri var.

Normal Loglama Nedir?

  • Her veri değişikliği (INSERT, UPDATE, DELETE), transaction log’a ayrıntılı şekilde yazılır.
  • Bu sayede işlemler geri alınabilir (ROLLBACK) veya yeniden yapılabilir (RECOVERY).
  • Ancak performansı düşürür çünkü çok fazla log yazılır.

Minimal Loglama Nedir?

  • Bazı işlemlerde daha az log yazılır.
  • Rollback yapılamaz, ama işlem çok hızlı olur.
  • Genellikle büyük veri ekleme veya taşıma işlemlerinde kullanılır.

Ne Zaman Minimal Loglama Yapılır?

Minimal loglama şu koşullarda mümkündür:

  1. Veritabanı Recovery Model’i “BULK_LOGGED” veya “SIMPLE” olmalı.
  2. Aşağıdaki işlemler yapılmalı:
    • BULK INSERT
    • SELECT INTO
    • INSERT … WITH (TABLOCK)
    • MERGE (bazı durumlarda)
    • CREATE INDEX, ALTER INDEX … REBUILD

Avantajları

  • Çok büyük veri işlemlerinde performansı ciddi artırır.
  • Özellikle ETL (veri yükleme) senaryolarında idealdir.

Dezavantajları

Tam log yoktur, bu yüzden:
Geri alma (rollback) mümkün değildir. Yedekleme sonrası geri yükleme daha zor olabilir.

LOG SHIPPING gibi bazı yedekleme senaryolarında sorun çıkarabilir.


Örnek bir Page Header çıktısı:

PAGE HEADER:
m_pageId = (1:12345)
m_type = 1 (Data Page)
m_slotCnt = 3
m_freeCnt = 2450
m_lsn = (23:458:2)

Bu sayfa 1 numaralı dosyanın 12345. sayfası ve veri sayfası (Data Page) olduğunu gösteriyor. Sayfa içinde 3 veri satırı var ve 2450 byte boş alan bulunuyor.

m_lsn = (23:458:2): 23 ifadesi virtual log file numarasını göstermektedir. 458 log block numarasıdır. (Offset)Log dosyası içerisindeki belirli bir blocktur. 2 değeri log block içerisindeki kayıt numarasıdır.

Eğer bir index sayfasını incelemek istiyorsanız, DBCC IND çıktısındaki IndexID değerini kontrol edip, Index sayfalarına DBCC PAGE ile bakabilirsiniz.

Örneğin, aşağıdaki komut ile birinci veri dosyasındaki(mdf) 15000 page numarısındaki kaydın type kısmı 2 ise index türünü incelemiş olmaktadır.

Ghost kayıt (silinmiş ama henüz temizlenmemiş) yok anlamına gelir.

DBCC TRACEON (3604);
DBCC PAGE ('TestDB', 1, 15000, 3);

Bu şekilde index yapılarındaki verilerin nasıl saklandığını görebilirsiniz.

Bu makalede DBCC Page Header kavramını detaylı bir şekilde görmüş olduk. Başka bir makalede görüşmek dileğiyle.

“Şüphesiz biz, ölüleri mutlaka diriltiriz. Onların yaptıklarını ve bıraktıkları eserlerini yazarız. Biz, her şeyi apaçık bir kitapta (Levh-i Mahfuz’da) bir bir kaydetmişizdir.”Yasin-12

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir