MSSQL Server Storage Kavramları

SQL Server Storage Kavramları, SQL Server’da verilerin fiziksel olarak depolanma, yönetilme ve erişim süreçlerini ifade eder. Bu kavramlar, veritabanının hem performanslı hem de güvenilir bir şekilde çalışmasını sağlamak için oldukça önemlidir. İşte SQL Server’da kullanılan temel Storage Kavramları:


 1. Data File
Veritabanındaki tablolar, dizinler ve diğer veritabanı nesnelerinin fiziksel verilerinin depolandığı dosyalardır. Türleri:
Primary Data File (MDF): Veritabanının ana veri dosyasıdır. Her veritabanında yalnızca bir adet bulunur.
Secondary Data File (NDF): Büyük veritabanlarında, veri yükünü dağıtmak için kullanılan ek veri dosyalarıdır (isteğe bağlıdır).

2. Log File (LDF)
Veritabanındaki işlemler (INSERT, UPDATE, DELETE vb.) ve değişikliklerin kaydedildiği dosyalardır.
Transaction Durability: Sistem çökse bile tamamlanan işlemlerin kaybolmamasını sağlar.
Rollback ve Recovery: İşlemler geri alınabilir (ROLLBACK) ve sistem çökmesi sonrası veritabanı geri yüklenebilir (RECOVERY).

3. Page Tipleri
SQL Server, verileri disk üzerinde 8 KB’lik sayfalar halinde saklar. Sayfa Türleri:
Data Pages: Tablolardaki satır verilerini depolar. Bir tabloya ait satırların fiziksel depolandığı yer burasıdır.
Index Pages: Bir tablonun index yapısını depolar ve indexsler üzerinden hızlı veri erişimi sağlar..
Text/Image Pages: TEXT, NTEXT, IMAGE gibi büyük veri türlerini (LOB  Large Object Data) depolar. Eğer bir veri satırı 8 KB’yi aşarsa, bu tür veriler LOB_DATA Pages adı verilen özel sayfalarda depolanır.  Örneğin, bir büyük dosya veya uzun bir metin bu sayfalarda saklanır.

Row Overflow Pages: Bir satırın boyutu 8,060 bayt sınırını aşarsa, taşan veriler bu sayfalarda depolanır. Özellikle VARCHAR, NVARCHAR gibi değişken uzunluklu veri türlerinde taşmalar olur. Ana satırın tutulduğu veri sayfasında bir işaretçi ile bu taşma sayfasına referans verilir.
GAM (Global Allocation Map): Veritabanındaki uniform extents   kullanım durumunu izler. Hangi extents’lerin boşta ya da kullanımda olduğunu gösterir. Her GAM sayfası, 64,000 extents’i (4 GB) takip edebilir.
SGAM (Shared Global Allocation Map): Paylaşılan extents’lerin (Mixed Extents) durumunu izler. Hangi mixed extents’lerin boş sayfalar içerdiğini gösterir. Yeni küçük tablolar ve dizinler için bu bilgiler kullanılır.

IAM Pages (Index Allocation Map): Belirli bir tablo veya index için ayrılmış extents’lerin fiziksel yerlerini izler. Tablo veya dizinlerin hangi sayfalarının hangi extents’te olduğunu takip eder.
PFS Pages (Page Free Space): Veri sayfalarındaki kullanılabilir boş alan miktarını izler. Her sayfanın boş alan durumu 0 ile 100 arasında bir oran olarak kaydedilir. SQL Server, yeni veri eklerken bu bilgiyi kullanır.

Boot Page: Veritabanının temel bilgilerini (metadata) içerir. Her veritabanında sadece bir tane bulunur ve kritik sistem bilgileridir. Örneğin, veritabanının adı, oluşturulma tarihi ve versiyonu gibi bilgiler buradadır.
Differential Change Map (DCM Pages): Son tam yedeklemeden (Full Backup) sonra değişen extents’leri izler.  Diferansiyel yedeklemelerde hangi extents’lerin değiştiğini tespit etmek için kullanılır.
Bulk Changed Map (BCM Pages): Toplu işlemler (Bulk Operations) sırasında değişen extents’leri izler. Toplu işlemler sırasında oluşan değişikliklerin kayıt altında tutulması için kullanılır.
File Header Page: Veritabanındaki her veri dosyası, dosyayla ilgili bilgiler içeren bir başlık (header) sayfasına sahiptir. Dosya adı, boyutu ve durum gibi bilgiler bu sayfada tutulur.

 4. Extents
 Sayfaların daha büyük gruplar halinde yönetilmesini sağlar. Sql serverın en temel birimi pagedir. Disk üzerinde yapılan I/O page seviyesinde gerçekleştirilir. Sql server verileri diskten 64 kb’lık extentler şeklinde çekmektedir.
 Her extents 8 page (8 x 8 KB = 64 KB) oluşur. Türleri:
 Uniform Extents: Aynı nesneye ait 8 page’den oluşur.
 Mixed Extents: Farklı nesnelere ait page’leri barındırır. (özellikle küçük tablolar için kullanılır).

SQL Server alanı daha verimli kullanabilmek için bir objeye direk bir Uniform Extent tahsis etmez. Öncelikle Extent’i Mixed Extent olarak oluşturur. Eğer aynı obje 8 page’i dolduracak kadar büyürse bu oluşturulan Mixed Extent daha sonra Uniform Extent’e dönüştürülür.

Sql server bir veriyi okumak istediğinde ilk olarak memory’e bakmaktadır. Eğer aranan ifade memory’de yoksa veriyi almak için disk’e gider. Burada diskimizin formatlanma biçimi karşımıza çıkmaktadır. Eğer diskimizin formatlanma biçimini 8 kb olarak seçmişsek  sql server ilgili veriye erişmek için disk’e  8 defa erişmesi(64/8=8) gerekmektedir. Buda performans anlamında bizlere sıkıntıya sebebiyet verecektir.  Eğer diskimizi formatlarken veya sıfırdan kurulum yaparken Allocation Unit Size değerini 64 kb olacak şekilde formatlarsak sql server diskten veriyi alırken 1 defa işlem yapmasını sağlayacaktır.(64/64=1)

Kısacası formatlanma biçimi 8 kb ise sql server diskten sadece 1 satır okumak istediğinde diskte 8 defa gidip gelmiş olacak. Bu işlem dikkat ederseniz sadece 1 satırlık bir işlem için.
Aşağıdaki komut sayesinde diskimizin  Allocation Unit Size değerini cmd komut satırında veya powershell üzerinde gözlemleyebiliriz.

fsutil fsinfo ntfsinfo E:

Yukarıdaki ekran resminde Bytes Per Cluster değerimiz  ilgili diskimizin formatlanma biçimi olarak karşımıza çıkmaktadır. Bu yöntem haricinde öğreneceğimiz başka bir yöntem ilgili diskimizin üzerine sağ tıklayıp Format bölümüne tıkladığımızda Allocation Unit Size değerini görebiliriz.

Sayfamızda diskin yanlış formatlanması sonucu diskimizin nasıl bir yöntem izlediğimizi veya formatlandığını okuyabilirsiniz.

5. Buffer Pool
Buffer Pool, SQL Server’ın bellek (RAM) içindeki ana veri önbelleğidir. Veritabanı sayfalarını RAM’de tutarak, disk erişimini mümkün olduğunca azaltmak. RAM çok hızlıdır. Disk (özellikle mekanik disk) yavaştır. SQL Server, veritabanı sayfalarını (8 KB’lık bloklar) doğrudan diskten okumaz. Bunun yerine: Bir sorgu çalışır. Gerekli veri varsa önce Buffer Pool’a bakar. Varsa → doğrudan RAM’den alır (çok hızlı). Yoksa → diski okur, sayfayı Buffer Pool’a yükler.

Buffer Pool’da Neler Saklanır?

1. Data Pages

  • Gerçek tablo verilerinin bulunduğu sayfalardır.
  • Örneğin: SELECT * FROM Customers → bu veri burada tutulur.

2. Index Pages

  • İndeks verileri burada tutulur.
  • Sorgular hızlı erişim için bu sayfaları kullanır.

3. Dirty Pages

  • Bellekte değişmiş ama henüz diske yazılmamış sayfalardır.
  • Örnek: UPDATE yaptığında, SQL Server önce bu değişikliği RAM’de yapar.
  • Bu sayfalar Lazy Writer ya da Checkpoint süreciyle daha sonra diske(mdf-ndf) yazılır. Bu işlem log dosyasına yazıldıktan sonra gerçekleşmektedir.

Buffer Pool’un Dinamik Çalışması

  • LRU (Least Recently Used) mantığıyla çalışır:
    Uzun süredir kullanılmayan sayfalar bellekte yer açılsın diye çıkarılır.
  • Yeni sayfa gerektiğinde:
    Buffer Pool bir yer bulur, gerekiyorsa en az kullanılan sayfayı dışarı atar (eğer dirty ise önce diske yazar).

İlgili SQL Server Bileşenleri

BileşenGörev
Buffer ManagerBuffer Pool’un yönetimini yapar.
Lazy WriterBellekten çıkarılacak dirty page’leri diske yazar.(LRU prensibiyle) Dirty page olmayanlarıda bu mantıkla çıkarmaktadır.
CheckpointTüm dirty page’leri düzenli olarak diske yazar recovery süresinin kısalması için.

6. Filegroups (Dosya Grupları)
Birden fazla veri dosyasını mantıksal bir grup altında organize etmek. Büyük veritabanlarında veri yükünü farklı disklerde dağıtmak için kullanılır.
Primary Filegroup: Ana dosya grubu; MDF dosyası buraya dahildir.
Userdefined Filegroups: Kullanıcı tarafından oluşturulabilir ve NDF dosyaları buraya atanabilir.

7. Transaction Log ve Checkpoint
Transaction Log: SQL Server, yapılan her değişikliği Transaction Log’a kaydeder. Memory’de bulunan Log Cache sayesinde değişiklikler bellekte tutulur ve ardından diske yazılır. Diskten kastı ldf dosyasıdır. Bu yapılan işlem commit işlemidir.
Checkpoint:  Dirty page’leri diske yazarak kurtarma süresini (recovery time) optimize etmek, ldf dosyasına yazıldığı garanti edilen değişiklikleri diske(mdf-ndf) yazar. Kısacası sistem kapandıktan sonra veritabanının recovery süresini kısaltmaktır.

8. TempDB
Geçici verilerin saklandığı ve işlendiği veritabanıdır. Geçici tablolar sorgu sırasında oluşturulan ara sonuçlar, Online dizin yeniden oluşturma işlemleri, SQL Server yeniden başlatıldığında temizlenir ve sıfırdan oluşturulur.

9. File Allocation Table (FAT)
SQL Server, hangi sayfaların hangi veritabanı nesnesine ait olduğunu takip etmek için FAT benzeri bir yapı kullanır.
GAM (Global Allocation Map): Hangi uniform extents’lerin kullanıldığını gösterir.
SGAM (Shared Global Allocation Map): Hangi mixed extents’lerin paylaşımlı olarak kullanıldığını gösterir.

10. Lazy Writer
Bellek yönetiminden sorumlu bileşendir. Sık kullanılmayan veya eski verileri bellekten çıkarır. Yeni sayfalar için yer açar. Veritabanı performansını artırır ve gereksiz bellek tüketimini önler. Bellekte yer açmak için kullanılmayan ya da az kullanılan sayfaları RAM’den çıkarır. Belleği temizler ve verimli kullanılmasını sağlar. Ldf dosyasına yazılmış dirty pageleri diske(mdf-ndf) yazar, ardından belleği boşaltır. Yeni gelen veri için yer açar.

11. Disk I/O Kavramları
Read Ahead Mechanism: SQL Server, bir sorgunun ihtiyaç duyacağı veri sayfalarını önceden tahmin edip belleğe yükler. Sorgu henüz sayfalara ihtiyaç duymadan, SQL Server arka planda bu sayfaları diske gitmeden RAM’e taşır. Böylece sorgu çalıştığında sayfalar zaten bellekte olur → performans artar.
Write Ahead Logging (WAL): Veri sayfalarındaki değişiklikler önce transaction log (LDF) dosyasına yazılır, sonra veri dosyasına (MDF) yansıtılır. Veri güvenliği sağlar: sistem çökse bile log sayesinde işlemler geri alınabilir veya tekrar uygulanabilir. ACID ilkelerinin “durability” (kalıcılık) ilkesini sağlar. Bu bir yazma şeklidir. Mdf dosyasına yazma şekli değildir. Bu belirtilen ifade sadece ldf dosyasına yazma prensibidir. Daha sonra checkpoint işlemi düzenli olarak ldf dosyasına yazılmış dirty pageleri mdf veya ndf dosyasına yazmaktadır. Lazy Writer Bellek baskısı olduğunda dirty page’leri MDF’e yazar. Eager Writing olarak geçen Bulk işlemlerde doğrudan MDF’e yazabilir.
İşleyiş:

  • UPDATE, INSERT gibi işlemler önce log cache’e yazılır.
  • COMMIT edildiğinde bu log, LDF dosyasına diske yazılır.
  • Ancak veri sayfaları hemen diske yazılmaz — RAM’deki dirty page olarak kalabilir.
  • Daha sonra Checkpoint ya da Lazy Writer ile asıl dosyaya (MDF) yazılır.

Checkpoint işlemi sırasında, SQL Server en son yazılan LSN (Log Sequence Number) değerini kaydeder. Bu LSN bilgisi, checkpoint anına kadar hangi transaction log kayıtlarının karşılık gelen dirty page’leri veri dosyalarına (MDF/NDF) yazdırdığını işaretler. Sistem bu mekanizma sayesinde:

  1. Hangi dirty page’lerin zaten diske yazıldığını
  2. Olası bir kurtarma (recovery) durumunda hangi LSN’den itibaren log kayıtlarını yeniden işlemesi gerektiğini

kesin olarak belirleyebilir. Checkpoint-LSN ilişkisi, veri bütünlüğünü garanti altına alan bu kritik senkronizasyonu sağlar.

Genel olarak tüm bu mekanizmalar birlikte çalışarak SQL Server’da:

  • Hızlı veri okuma (Read-Ahead prensibi)
  • Güvenli ve tutarlı veri yazma (WAL prensibi)
  • Verimli bellek kullanımı (Lazy Writer)

sağlar. Bu sayede hem performans yüksek, hem de veri güvenliği garantilidir.


SQL Server, veritabanı verilerini disk ve bellek arasında etkin bir şekilde yönetmek için tasarlanmıştır. Pages, Extents, Filegroups gibi yapıların doğru kullanımı, hem performansı artırır hem de büyük veri setlerinde kolaylık sağlar. Transaction Log, veri tutarlılığı ve kurtarılabilirlik için kritik bir rol oynar, TempDB ise geçici veri işlemleri için optimize edilmiştir.

Bu makalede sql server Storage kavramlarını detaylı bir şekilde görmüş olduk. Başka makalede görüşmek dileğiyle.

 “Allah’tan kulları içinde ancak ilim sahibi olanlar korkar.” Fâtır sûresi – 28

Author: Yunus YÜCEL

Bir yanıt yazın

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