MODUL 4 - LEKCIJA 1

In-Memory OLTP (Hekaton)

Baze podataka bez zaključavanja (lock-free) za maksimalne performanse transakcija

⏱️ Trajanje: ~3 časa 📚 Nivo: Ekspertski 🎯 Praktični primjeri: 4

📖 Zašto In-Memory?

Standardne tabele (disk-based) pate od latencije diska i "lock contention-a" (zaključavanja redova dok ih drugi procesi čitaju). Kod ekstremnih zahtjeva (stotine hiljada transakcija po sekundi), standardna arhitektura dostiže limit. In-Memory OLTP uvodi potpuno novi Lock-free engine koji podatke drži isključivo u RAM-u, koristeći optimistični concurrency control.

🏗️ Arhitektura bez zaključavanja

Za razliku od standardnih tabela, In-Memory tabele:

📊 Tipovi In-Memory Tabela

1. SCHEMA_AND_DATA (Durable)

Podaci se čuvaju u RAM-u, ali se svaka promjena zapisuje na disk. Ako se server ugasi, podaci su sigurni. Ovo je default za kritične podatke.

2. SCHEMA_ONLY (Non-Durable)

Ekstremna brzina. Podaci postoje SAMO u RAM-u. Ako se server restartuje, tabela postaje prazna. Idealno za Session state, caching ili privremenu obradu.

🛠️ Kreiranje In-Memory Tabele
-- Prvo nam treba Filegroup za In-Memory podatke
ALTER DATABASE MyDatabase ADD FILEGROUP IM_FG CONTAINS MEMORY_OPTIMIZED_DATA;
GO

CREATE TABLE Web.UserSession (
    SessionID UNIQUEIDENTIFIER PRIMARY KEY NONCLUSTERED,
    UserID INT NOT NULL,
    LoginTime DATETIME2 NOT NULL
) 
WITH (MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_ONLY);
GO

⚡ Nativno Kompajlirane Stored Procedure

To su procedure kreirane sa klauzulom NATIVE_COMPILATION. One su do 100x brže od običnih procedura jer se kompajliraju direktno u mašinski kod (C kod) umjesto da se interpretiraju kroz T-SQL engine.

Kako Native Compilation Radi?

Kada kreirate nativno kompajliranu stored procedure:

  1. Kompajliranje: SQL Server kompajlira procedure u DLL (Dynamic Link Library) fajl
  2. Optimizacija: Kod se optimizuje na najnižem nivou - direktno mašinski kod
  3. Učitavanje: DLL se učitava u memoriju SQL Server procesa
  4. Izvršavanje: Procedure se izvršava direktno bez T-SQL interpretacije

🔑 Zahtjevi za Native Compilation

  • SCHEMABINDING: Obavezno - procedure mora biti vezana za shemu
  • ATOMIC blok: Svi kod mora biti u BEGIN ATOMIC...END bloku
  • Isolation Level: Mora biti SNAPSHOT ili REPEATABLE READ
  • Ograničenja: Neki T-SQL konstrukti nisu dozvoljeni (npr. subqueries, cursors, itd.)
🚀 Primjer Nativno Kompajlirane Procedure
CREATE PROCEDURE Web.usp_AddSession
    @SessionID UNIQUEIDENTIFIER, 
    @UserID INT
WITH NATIVE_COMPILATION, SCHEMABINDING
AS 
BEGIN ATOMIC WITH (
    TRANSACTION ISOLATION LEVEL = SNAPSHOT, 
    LANGUAGE = N'us_english'
)
    INSERT INTO Web.UserSession (SessionID, UserID, LoginTime)
    VALUES (@SessionID, @UserID, SYSDATETIME());
END;
GO

-- Napomena: 
-- - NATIVE_COMPILATION: Kompajlira u mašinski kod
-- - SCHEMABINDING: Obavezno za native procedure
-- - BEGIN ATOMIC: Sve mora biti u atomic bloku
-- - SNAPSHOT isolation: Obavezno za In-Memory tabele

Prednosti Native Compilation

Nedostaci Native Compilation

🎯 Praktična Vježba: Uništavanje uskih grla

Zadatak: Migracija "Heavy Hitter" Tabele

Tabela RealTimeLogs prima 50.000 upisa u sekundi i usporava cijelu bazu. Moramo je prebaciti u In-Memory mode.

Zadatak 1: Kreirajte MEMORY_OPTIMIZED verziju tabele sa bar jednim In-Memory indeksom (Hash Index).

💡 Rješenje sa Hash Indeksom
CREATE TABLE dbo.HighSpeedLogs (
    LogID INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED,
    LogMsg NVARCHAR(100) NOT NULL,
    LogDate DATETIME2 NOT NULL INDEX IX_LogDate HASH WITH (BUCKET_COUNT = 100000)
) WITH (MEMORY_OPTIMIZED = ON);
GO

-- BUCKET_COUNT je ključan za performanse Hash indeksa (treba biti cca 2x broj redova).

✅ Zaključak

In-Memory OLTP nije za sve podatke, već za uska grla:

📚 Sljedeća Lekcija

U Lekciji 4.2 istražujemo XML. Naučićete kako SQL Server čuva, pretražuje i transformiše kompleksne XML dokumente pomoću XQuery jezika.