MODUL 2 - LEKCIJA 3

Columnstore Indeksi

Arhitektura za masovne analitičke upite i real-time reporting

⏱️ Trajanje: ~3 časa 📚 Nivo: Napredni 🎯 Praktični primjeri: 5

📖 Analitika u realnom vremenu

Standardni indeksi (B-Tree) su dizajnirani za brzo pronalaženje pojedinačnih redova (OLTP). Međutim, kada želite sumirati prodaju u zadnjih 5 godina preko 100 miliona redova, B-Tree postaje prespor. Columnstore Indeksi spremaju podatke po kolonama, a ne po redovima, omogućavajući kompresiju i brzinu čitanja koju je ranije bilo nemoguće zamisliti.

🏗️ Columnstore Internals: Kako je moguće 100x ubrzanje?

1. Columnar Storage vs Row Storage

U row-store tabeli, sve kolone jednog reda su fizički jedna pored druge. Čak i ako tražite samo Suma, SQL Server mora pročitati cijeli red sa diska u RAM. U column-store, svaka kolona se čuva odvojeno. Ako upit traži jednu kolonu, SQL Server čita SAMO tu kolonu.

2. Row Groups i Segments

⚡ Batch Mode Execution

Columnstore ne obrađuje red jedan po jedan. On koristi Batch Mode gdje CPU obrađuje cca 900 redova odjednom u svojim registrima (SIMD instrukcije). Ovo drastično smanjuje CPU load.

🔄 Delta Store: Rješavanje problema izmjena

Columnstore segmenti su read-only i visoko kompresovani. Šta se dešava kada uradite INSERT?

  1. Novi podaci prvo idu u Delta Store (privremeni B-Tree red-store).
  2. Kada Delta Store dostigne ~1 milion redova, proces zvan Tuple Mover ga kompresuje u novi Columnstore Segment.
🛠️ Kreiranje Clustered Columnstore Indeksa
-- Pretvaranje velike tabele u analitičku zvijer
CREATE CLUSTERED COLUMNSTORE INDEX CCI_EconomicData 
ON Stats.EconomicData;
GO

-- Od ovog trenutka, tabela više nema "redove" na disku, samo kolumnarne segmente.

💎 Real-Time Operational Analytics (Hybrid)

Ovo je "sveti gral" baza podataka. Na transakcionu tabelu (B-Tree) dodajemo Non-clustered Columnstore Index (NCCI).

⚡ Hibridni Indeks sa Filterom
-- Indeksiramo samo objavljene izvještaje za reporting, 
-- ostavljajući draft izvještaje brzim
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_HistoricalAnalytics
ON Stats.Reports (ReportID, CreatedDate, DepartmentID)
INCLUDE (ReportType)
WHERE Status = 'Published';
GO

🎯 Praktična Vježba: Row vs Column Brzina

Zadatak: Million Row Challenge

Uporedićemo performanse sumiranja na milionima redova.

Zadatak 1: Kreirajte tabelu TestStore i napunite je sa 5 miliona redova nasumičnih podataka.

Zadatak 2: Izmjerite vrijeme za SUM(Amount) bez Columnstore indeksa.

Zadatak 3: Kreirajte Clustered Columnstore indeks i ponovite mjerenje.

💡 Mjerna Skripta
SET STATISTICS TIME ON;
SET STATISTICS IO ON;

-- Upit nad row-store (očekujte puno IO čitanja)
SELECT SUM(Amount), AVG(Quantity) FROM BigData;

-- Kreiranje magije
CREATE CLUSTERED COLUMNSTORE INDEX CCI_Magic ON BigData;

-- Upit nad column-store (očekujte skoro nula IO i trenutačan rezultat)
SELECT SUM(Amount), AVG(Quantity) FROM BigData;

SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;

✅ Zaključak

Columnstore tehnologija je promijenila SQL Server iz transakcionog engine-a u analitičku platformu svjetske klase:

📚 Sljedeća Lekcija

U Lekciji 2.4 se vraćamo pisanju koda. Naučićete Window Functions i CTE, alate koji će vaše T-SQL upite učiniti kraćim, čitljivijim i mnogo moćnijim.