Allocation Birimleri

Tablo, tablolar içerisinde oluşturulan indexler ve heap’lerin hepsi SQL Server içerisinde birden fazla partition’a (bölümleme) ayrılabilir. Eğer tablo için herhangi bir bölümleme işlemi yapılmadıysa oluşturulan tablolar varsayılan olarak tek bir bölümlemede yer alacak ve veriler bu bölümlemeye göre diskte depolanacaktır.

SQL Server’da veriler en küçük birim olan page içerisinde saklanır. Verilerin saklanması için diskte yer açılan page’ler direkt olarak tablo veya indexlere atanmazlar. Page’ler, depoladıkları veri türüne göre (tablodaki sütunların veri türleri) ilk önce Allocation Unit (atanabilir birim) ismi verilen mantıksal yapılar şeklinde gruplandırılır ve ardından bölümlemelere atanır. Tablo ilk oluşturulduğunda, sütunların veri tipine göre allocation birimleri oluşturulur.

Bölümleme içerisinde page’lerin sınıflandırılmasında 3 farklı türde allocation birimi bulunmaktadır.

  • IN_ROW_DATA
  • ROW_OVERFLOW_DATA
  • LOB_DATA

Bunlara kısaca page türleri de diyebiliriz. Şimdi her birini teker teker inceleyelim.


IN_ROW_DATA

Bir page içerisidne saklanabilecek maksimum veri miktarı 8,060 bayt boyutundadır. Yeni eklenen veri boyutu bu 8,060 limiti altındaysa SQL Server bu verilerin depolandığı page’leri IN_ROW_DATA olarak sınıflandırır. Partition içerisinde genellikle bu page türü çoğunluktadır.

USE tempdb
GO

CREATE TABLE DemoTable
( col1 VARCHAR(4000) );

INSERT INTO DemoTable
VALUES ( REPLICATE('a', 4000) );

SELECT OBJECT_NAME (object_id) AS TABLE_NAME, rows, type_desc AS PAGE_TYPE
FROM sys.partitions p
INNER JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE object_id = object_id('DemoTable');
IN_ROW_DATA


ROW_OVERFLOW_DATA 

Bu page türü de kaydedilecek verinin boyutu 8,060 bayt limitini aştığında ROW_OVERFLOW_DATA olarak sınıflandırılır.

USE tempdb
GO

CREATE TABLE DemoTable
(
col1 VARCHAR(2000)
,col2 VARCHAR(8000)
);

INSERT INTO DemoTable (col1, col2)
VALUES ( REPLICATE('a', 2000), REPLICATE('b', 8000) );

SELECT OBJECT_NAME (object_id) AS TABLE_NAME, rows, type_desc AS PAGE_TYPE
FROM sys.partitions p
INNER JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE object_id = object_id('DemoTable');
ROW_OVERFLOW_DATA


LOB_DATA

LOB, Large Object‘in kısaltılmışıdır. Xml, varbinary(max) ve varchar(max) türündeki verilerin kaydedildiği page türleri LOB_DATA olarak sınıflandırılabilir.

USE tempdb
GO

CREATE TABLE DemoTable
(
col1 VARCHAR(2000)
,col2 VARCHAR(8000)
,col3 TEXT
);

INSERT INTO DemoTable (col1, col2, col3)
VALUES ( REPLICATE('a', 2000), REPLICATE('b', 8000), REPLICATE('a', 1000));

SELECT OBJECT_NAME (object_id) AS TABLE_NAME, rows, type_desc AS PAGE_TYPE
FROM sys.partitions p
INNER JOIN sys.allocation_units a
ON p.partition_id = a.container_id
WHERE object_id = object_id('DemoTable');
LOB_DATA


Tablo Başına Allocation Birimi Miktarı

Şimdi gelelim bunların maksimum miktarına. SQL Server’da bunların sayısı eski versiyonlarda değişik göstermekte fakat 2012 ve sonrasında herhangi bir değişiklik yok.

Daha önce de bahsettiğimiz gibi, page’ler oluşturulurken ilk önce gruplandırılır ardından bölümlemeler ile ilişkilendirilir. Bir tablo partition’lara ayrıldığı zaman her bir partition bir partition_id ve bir hobt_id alır. Veriler, tablonun heap veya binary-tree oluşuna göre page’lerde veri depolanması hobt ile ayarlanmaktadır ve locking mekanizmasında kullanılmaktadır. Aşağıda verilerin depolandığı hiyerarşi gösterilmiştir.

Allocation

Yukarıdaki resme göre sadece bir partition olan bir heap tabloda 3 adet allocation birimi bulunabilir ve şöyle bir formül çıkartabiliriz:

Allocation birim miktarı = Partition sayısı × Index sayısı × 3

SQL Server versiyonuTablo başına max partition sayısıTablo başına max index sayısıTablo başına max allocation birim sayısı
20051,000250750,000
20081,0001,0003,000,000
2012 ve üstü15,0001,00045,000,000

2012 ve üstü sürümlerde bir tablo 45 milyon adet allocation birimine sahip olabilir.


sys.allocation_units

Yukarıda örneklerde de kullanıldığı üzere bu sistem view, SQL Server içerisindeki veritabanlarındaki tüm allocation birimleri hakkında ayrıntıları satır satır sunmaktadır.

SELECT * FROM sys.allocation_units;
sys.allocation_units
Sütun ismiAçıklaması
allocation_unit_idAllocation birim ID’si
typeAllocation biriminin türü ( 0, 1, 2, 3)
type_descBirimin türünün açıklaması (DROPPED, IN_ROW_DATA, LOB_DATA, ROW_OVERFLOW_DATA)
container_idAllocation birimi ile alakalı depolama yerinin ID’si
dataspace_idAllocation biriminin tutulduğu filegroup ID’si
total_pagesBu allocation birimi tarafından rezerv edilen page sayısı
used_pagesRezerv edilen page’lerden kullanımda olanların sayısı
data_pagesÜç allocation türünden olan page’lerin sayısı

Kaynak:
SQL Server – Understanding Allocation Units – In Row Data, LOB Data & Row Overflow Data