Günümüzün yüksek trafikli uygulamalarında, geleneksel disk tabanlı veritabanı motorları bazen darboğazlara (latch ve lock çekişmeleri gibi) neden olabilir. Microsoft tarafından “Hekaton” kod adıyla geliştirilen ve SQL Server 2014 ile hayatımıza giren In-Memory OLTP, bu darboğazları aşmak için tasarlanmış, veriyi tamamen bellekte optimize eden bir teknolojidir.
In-Memory OLTP, veritabanı tablolarının ana bellekte (RAM) yaşamasını sağlayan, yüksek eşzamanlılık (concurrency) ve düşük gecikme süresi (latency) hedefleyen bir veritabanı motoru eklentisidir. Geleneksel tabloların aksine, In-Memory tablolar diskten okunmaz; veri her zaman RAM’dedir. Ancak dayanıklılık (durability) için değişiklikler işlem günlüğüne (transaction log) yazılır ve checkpoint dosyaları aracılığıyla diskte saklanır. Tabi tüm verimizi memory’de tutmamız çoğunlukla olası değildir. Çok yoğun transaction alan tablolar için ya da çok hızlı cevap almak istediğimzi tablolar için bu özelliği kullanabiliriz.
In-Memory OLTP’yi geleneksel yapılardan ayıran üç temel sütun vardır:
- Lock ve Latch-Free Tasarım: Geleneksel motorlarda veriye erişirken “Lock” (kilit) mekanizmaları kullanılır. In-Memory OLTP’de ise iyimser çoklu sürüm kontrolü (Optimistic Multi-Version Concurrency Control – MVCC) kullanılır. Bu sayede okuma ve yazma işlemleri birbirini asla engellemez.
- Native Compilation (Yerel Derleme): T-SQL kodları (Stored Procedure’lar), C koduna dönüştürülür ve makine dilinde derlenmiş DLL’ler olarak çalıştırılır. Bu, yorumlanmış T-SQL’e göre muazzam bir CPU verimliliği sağlar.
- B-Tree Yerine Hash ve Range Indexler: Veriler bellekte olduğu için geleneksel sayfa (page) yapısı yoktur. Bunun yerine bellek adreslerini işaret eden özel indeks yapıları kullanılır.
Avantajları ve Dezavantajları
Avantajlar
- Disk I/O ve kilitlenme (locking) sorunları ortadan kalktığı için 10 kata kadar performans artışı sağlayabilir.
- Native Compilation sayesinde birim işlem başına harcanan CPU döngüsü azalır.
- Çok çekirdekli sistemlerde (Multi-core) latch çekişmesi olmadığı için lineer bir performans artışı sunar.
- Bellek içi tablo değişkenleri (Table Variables) kullanarak TempDB üzerindeki baskı düşürülebilir.
Dezavantajlar ve Kısıtlamalar
- Tablo boyutu RAM kapasitesiyle sınırlıdır. RAM biterse INSERT işlemleri başarısız olur.
- LOB (Large Object) verileri (varchar(max) vb.) SQL 2016 öncesinde desteklenmiyordu; modern sürümlerde desteklense de performans kaybına yol açabilir.
- In-Memory tablolarda oluşturulan indeksler sonradan ALTER ile değiştirilemez (SQL 2017+ öncesi için). Tabloyu drop edip yeniden oluşturmak gerekebilir.
- Sadece 64-bit SQL Server sürümlerinde çalışır.
In-Memory OLTP her senaryo için sihirli bir değnek değildir. Şu durumlarda tercih edilmelidir:
- Yüksek Veri Girişi (High Ingest): IoT cihazlarından gelen veriler veya yoğun log kayıtları.
- Düşük Gecikme Gereksinimi: Finansal işlemler veya gerçek zamanlı borsa verileri.
- Yoğun TempDB Kullanımı: Tablo değişkenleri veya geçici tablolar nedeniyle TempDB’de darboğaz yaşanıyorsa.
- Session State Yönetimi: Web uygulamalarında oturum bilgilerinin çok hızlı yazılıp silindiği senaryolar.
Bir veritabanında In-Memory OLTP kullanmak için şu adımları izlemeniz gerekir:
1. Veritabanına Memory Optimized Filegroup Ekleme
Verilerin diskteki kalıcılığını sağlamak için özel bir filegroup gereklidir.
ALTER DATABASE VeritabaniAdim
ADD FILEGROUP InMem_FG CONTAINS MEMORY_OPTIMIZED_DATA;
ALTER DATABASE VeritabaniAdim
ADD FILE (NAME='InMem_File', FILENAME='/yol/InMem_File.ndf')
TO FILEGROUP InMem_FG;
2. Tablo Oluşturma
Tablo oluştururken MEMORY_OPTIMIZED = ON ve DURABILITY seçenekleri belirtilir.
CREATE TABLE dbo.StokTakip (
UrunID INT NOT NULL PRIMARY KEY NONCLUSTERED,
StokAdet INT NOT NULL,
SonGuncelleme DATETIME2 NOT NULL
) WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA);
- SCHEMA_AND_DATA: Sunucu kapanıp açıldığında veriler korunur (Önerilen).
- SCHEMA_ONLY: Sunucu kapanıp açıldığında tablo yapısı kalır ama veriler silinir (Geçici veriler için ideal).
Tablomuzu oluşturmak istediğimizde aşağıdaki gibi bir hata alabilirsiniz.
Msg 12329, Level 16, State 103, Line 1
The data types char(n) and varchar(n) using a collation that has a code page other than 1252 are not supported with memory optimized tables.
Bu hata memory optimzed tablo’ların bütün collation tiplerini desteklememesinden kaynaklanmaktadır.
Aşağıdaki script yardımıyla desteklediği collation tiplerini görebilirsiniz.
SELECT NAME ,COLLATIONPROPERTY(NAME, 'codepage') AS [CodePage] FROM sys.fn_helpcollations()
WHERE COLLATIONPROPERTY(NAME, 'codepage') = 1252
3. Native Compiled Stored Procedure Yazma
Maksimum performans için prosedürlerin derlenmesi gerekir.
CREATE PROCEDURE dbo.usp_StokGuncelle
@UrunID INT, @Adet INT
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english')
UPDATE dbo.StokTakip SET StokAdet = @Adet WHERE UrunID = @UrunID
END;
Aşağıdaki script yardımıyla memory optimized tablolarda otomatik güncellemenin aktif olup olmadığını sorgulayabilirsiniz.
SELECT
QUOTENAME(SCHEMA_NAME(tbl.schema_id)) + N'.' + QUOTENAME(tbl.name) AS [tablo_ismi],
st.name AS [istatistik ismi],
CASE 1-st.no_recompute
WHEN 0 THEN 'HAYIR'
WHEN 1 THEN 'EVET'
END AS [otomatik güncelleme aktif mi?]
FROM sys.stats st JOIN sys.tables tbl ON st.object_id=tbl.object_id
WHERE tbl.is_memory_optimized=1
Eğer otomatik güncelleştirme kapalıysa manaul olarak istatistikleri güncellemek için aşağıdaki script’i kullanabilirsiniz. Sorgu size bir script verecektir. Bu script’i çalıştırmalısınız.
DECLARE @sorgu NVARCHAR(MAX) = N'';
SELECT
@sorgu += N'UPDATE STATISTICS '
+ quotename(schema_name(tbl.schema_id))
+ N'.'
+ quotename(tbl.name)
+ ';' + CHAR(13) + CHAR(10)
FROM sys.tables AS tbl
WHERE tbl.is_memory_optimized = 1 AND
tbl.object_id IN (SELECT object_id FROM sys.stats WHERE no_recompute=1)
SELECT @sorgu
Son olarak istatistik güncellennmesinden faydalanabilmesi için Natively compiled stored procedure’leri de manual olarak recompile etmelisiniz.
Başarı İçin Kritik İnce Detaylar
- Bucket Count Ayarı: Hash indeks kullanırken BUCKET_COUNT değeri, tablodaki tahmini benzersiz değer sayısının 1.5 ile 2 katı arasında olmalıdır. Yanlış ayar, performansın çökmesine neden olabilir.
- İşlemsel Log (Transaction Log): In-Memory tablolardaki işlemler de log dosyasına yazılır. Log diskinizin hızlı (NVMe SSD vb.) olduğundan emin olun.
- Memory Checkpoint: Veriler bellekte olsa da checkpoint işlemleri sırasında disk I/O sıçramaları görülebilir; bu süreci izlemek kritiktir.
- İstatistikler: In-Memory tablolarda istatistikler otomatik güncellenmez (eski sürümlerde). SQL 2016 (Auto-update statistics) ve sonrasını kullanmıyorsanız manuel güncelleme yapmalısınız.
In-Memory OLTP, doğru planlama ve donanımla SQL Server performansını bambaşka bir seviyeye taşıyan, ancak “bellek yönetimi” konusunda disiplin isteyen güçlü bir araçtır.
Başka makalede görüşmek dileğiyle..
“Şüphesiz, Rabbin sana verecek ve sen de hoşnut olacaksın.”. Duha Süresi-5 Ayet
