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');
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');
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');
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.
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 versiyonu | Tablo başına max partition sayısı | Tablo başına max index sayısı | Tablo başına max allocation birim sayısı |
2005 | 1,000 | 250 | 750,000 |
2008 | 1,000 | 1,000 | 3,000,000 |
2012 ve üstü | 15,000 | 1,000 | 45,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;
Sütun ismi | Açıklaması |
allocation_unit_id | Allocation birim ID’si |
type | Allocation biriminin türü ( 0, 1, 2, 3) |
type_desc | Birimin türünün açıklaması (DROPPED, IN_ROW_DATA, LOB_DATA, ROW_OVERFLOW_DATA) |
container_id | Allocation birimi ile alakalı depolama yerinin ID’si |
dataspace_id | Allocation biriminin tutulduğu filegroup ID’si |
total_pages | Bu allocation birimi tarafından rezerv edilen page sayısı |
used_pages | Rezerv 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