Geleneksel (Interpreted) bir stored procedure çalıştırıldığında, SQL Server bu kodu çalışma anında yorumlar ve bir yürütme planı oluşturur. Natively Compiled Stored Procedure ise oluşturulduğu anda C koduna dönüştürülür ve ardından bir DLL (Dynamic Link Library) olarak derlenir.
Temel Farklar:
- Yorumlanmaz, Derlenir: Kod, işlemcinin doğrudan anlayabileceği makine diline (Machine Code) çevrilir.
- Bellek Odaklıdır: Yalnızca Memory-Optimized Tables (Bellek üzerinde optimize edilmiş tablolar) ile çalışır.
- Verimlilik: Geleneksel prosedürlerdeki “interpret” yükünü ortadan kaldırarak CPU döngülerinden tasarruf sağlar.
Bu teknoloji her senaryo için uygun değildir, ancak aşağıdaki durumlarda muazzam performans artışı sağlar:
- Yüksek Performans Gereksinimi: Milisaniyenin altında tepki süresi gereken işlemler.
- Yoğun İş Mantığı: Çok sayıda döngü (loop) veya karmaşık hesaplama içeren prosedürler.
- Concurrency (Eşzamanlılık): Geleneksel tablolardaki “locking” ve “latching” (kilitlenme) sorunlarını yaşamadan binlerce eşzamanlı isteği işleme yeteneği.
Bir prosedürü “natively compiled” yapmak için CREATE PROCEDURE komutuyla birlikte belirli anahtar kelimeler kullanılır.
Örnek Kod Yapısı:
CREATE PROCEDURE dbo.usp_GetSalesData
@SalesID INT
WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC WITH
(
TRANSACTION ISOLATION LEVEL = SNAPSHOT,
LANGUAGE = N'English'
)
SELECT SalesName, Amount
FROM dbo.MemoryOptimizedSalesTable
WHERE SalesID = @SalesID
END
Dikkat Edilmesi Gereken Parametreler:
- WITH NATIVE_COMPILATION: Bu prosedürün yerel olarak derleneceğini belirtir.
- SCHEMABINDING: Prosedürün bağımlı olduğu tabloların silinmesini veya değiştirilmesini engeller. Bu, derleme için zorunludur.
- BEGIN ATOMIC: Natively compiled prosedürler tek bir atomik blok içinde çalışmalıdır. Eğer işlem başarısız olursa, blok içindeki her şey geri alınır (rollback).
- Transaction Isolation Level: Genellikle SNAPSHOT, REPEATABLEREAD veya SERIALIZABLE kullanılır.
Hızın bir bedeli vardır; her SQL komutunu bu prosedürler içinde kullanamazsınız:
| Özellik | Durum |
| Tablo Türü | Yalnızca Memory-Optimized tablolarla çalışır. |
| ALTER PROCEDURE | Desteklenmez. Değişiklik için DROP ve CREATE yapmanız gerekir. |
| CROSS-DATABASE | Farklı veritabanlarındaki tablolara erişemezsiniz. |
| Operatörler | Bazı karmaşık JOIN türleri ve OR kullanımı kısıtlı olabilir. |
Eğer uygulamanızda çok fazla veri girişi (high-throughput insert) yapılıyorsa veya saniyede on binlerce kez çağrılan kısa ve öz işlemleriniz varsa, Natively Compiled Stored Procedures kullanımı sisteminizi bir üst seviyeye taşıyacaktır. Ancak, raporlama gibi devasa veri setlerini tarayan ve disk tabanlı tabloları kullanan yapılar için geleneksel yöntemler hala en iyisidir.
Özetle CPU maliyetini düşürmek ve In-Memory teknolojisinin gücünden tam anlamıyla faydalanmak istiyorsanız, bu teknoloji sizin için en doğru araçtır.
Başka makalede görüşmek dileğiyle..
Başkaları ile alay etmeyin. Hucurat-11
