Kapitoly kurzu
1. Obsahová mapa kurzu 2. Notebooky: PySpark vs Pure Python 3. Demo: Tři cesty a Mini Medallion 4. CU Costs a Capacity Metrics 5. SQL trojúhelník 6. Real-Time Intelligence: demo arc 7. Semantic modely, DAX a optimalizace 8. Security a administrace Fabricu 9. Zkouška DP-600: tipy
Runbooky — medallion
10. Mini Medallion ČHMÚ 11. Mini Medallion NYC Taxi 12. NYC Taxi třemi cestami 13. Mini Medallion OpenAQ 14. Big Medallion OpenAQ (2 roky)
Runbooky — RTI
15. RTI Library: architektura 16. A: Bicycles 60s 17. B: ČHMÚ HTTP polling 18. C: NDIC dopravní detektory 19. D: Camera ALPR simulátor 20. E: PID GTFS-RT 21. F: Activator alerty 22. KQL cheat sheet
🏠 Rozcestník kurzu
DP-600 · Kapitola 5

SQL trojúhelník

SQL Database vs Lakehouse SQL endpoint vs Warehouse — a kde končí zvyky ze SQL Serveru
🗂 Kapitola kurzu

Cíle kapitoly

  • Rozlišit SQL Database, Lakehouse SQL analytics endpoint a Warehouse a vybrat správný pro use case
  • Psát cross-database dotazy přes 3-part naming a shortcuts místo linked serverů
  • Vyjmenovat, co ve Warehouse chybí oproti SQL Serveru (indexy, vynucené constraints, triggery, agent)
  • Navrhnout praktický pattern pro SQL tým a projít checklist migrace
5.1

Úvod

Cheat sheet pro účastníky se SQL Server backgroundem. Pomáhá orientovat se mezi třemi typy SQL endpointů ve Fabricu a srozumí, kde je hranice s klasickým SQL Serverem.

💡
Tip:

TL;DR pro netrpělivé:

  • SQL Database in Fabric — OLTP, full T-SQL, row-store, jako Azure SQL DB
  • Lakehouse SQL Analytics Endpoint — read-only T-SQL nad Delta Parquetem
  • Fabric Warehouse — OLAP, columnar, T-SQL DML s omezeními
  • Pro SQL tým: Warehouse je nejbližší známé práci, ale pár věcí chybí — viz sekce 4
5.2

Tři SQL endpointy ve Fabricu

Aspekt SQL Database Lakehouse SQL Endpoint Warehouse
Účel OLTP, transakce Ad-hoc query Delta tabulek OLAP, DWH
Storage LDF/MDF (under the hood) Delta Parquet (OneLake) Delta Parquet (OneLake)
Engine Azure SQL DB based Polaris (analytics) Polaris (analytics)
DML (INSERT/UPDATE/DELETE) Plný Žádný (read-only) Omezený
DDL (CREATE/ALTER) Plný Žádný (auto-managed) Plný
Stored procedures Plné – Ano, ale omezené (viz §4)
Indexy B-tree, columnstore, vše Auto (read-only) Pouze auto-managed
Triggery Ano – Ne
Concurrency model Snapshot/RC Snapshot Snapshot
Cross-DB query Linked server / 3-part Cross-Lakehouse (viz §3) 3-part naming + Shortcuts
GA / Preview GA (preview od 11/2024, GA od konce 2025 — ověřte) GA GA
Hlavní use case Aplikace OLTP, mikroservices, malé objemy Analytika existujícího Lakehouse Enterprise DWH s T-SQL
Velikost Až ~4 TB Bez limitu (storage = OneLake) Bez limitu
Min. capacity libovolná F / trial F2 F2

Vizuální shrnutí

SCHÉMA
                 ┌─── SQL Database ───┐
                 │  Pro OLTP / aplikace│
                 │  Plný T-SQL         │
                 │  Row-store + col.   │
                 └─────────────────────┘
                          ↓
                  pipelines / mirror
                          ↓
                  ┌────────────────┐
                  │   OneLake      │
                  │   (Delta)      │
                  └─┬──────────────┬┘
                    │              │
        ┌───────────┘              └───────────┐
        ↓                                       ↓
┌───────────────────┐               ┌──────────────────┐
│ Lakehouse SQL EP  │               │   Warehouse      │
│ Read-only T-SQL   │               │  OLAP DWH         │
│ Auto-managed      │               │  T-SQL DML        │
│ Jakýkoliv Delta   │               │  Procedures       │
└───────────────────┘               └──────────────────┘
        ↓                                       ↓
   Power BI Direct Lake / Excel / SSMS / ADS
5.3

Kdy co použít — decision matrix

Otázka Endpoint
Mám OLTP aplikaci, potřebuju transakce, indexy, triggery SQL Database
Mám Lakehouse a chci dotaz nad daty bez kopírování Lakehouse SQL Endpoint
Stavím enterprise DWH se star schema, ETL přes T-SQL Warehouse
Chci ingestovat surová data (CSV, JSON, raw files) Lakehouse Files → Tables (NE SQL DB)
Chci dělat T-SQL stored procedure ETL Warehouse
Chci INSERT/UPDATE z Notebooku Warehouse přes connector
Power BI Direct Lake report Lakehouse nebo Warehouse (oba mají endpoint)
Cross-database query Warehouse 3-part-naming, nebo Shortcuts
💡
Smíšený use case: Realisticky enterprise team v Fabricu používá kombinaci. SQL DB pro app integrace, Lakehouse pro raw data, Warehouse pro analytics. Účastníky tomu naučit už v Day 1 — že to nejsou alternativy, ale doplňky.
5.4

Cross-database queries — Linked Servers nahrazeny Shortcuts

V SQL Serveru řešili Linked Servers. V Fabric Warehouse:

Three-part naming

SQL
-- Z Warehouse "DW_Sales" dotaz na Warehouse "DW_Master" ve stejném workspace
SELECT s.OrderID, m.CustomerName
FROM dbo.SalesOrders s
JOIN [DW_Master].dbo.Customers m ON m.CustomerID = s.CustomerID;

Funguje: Warehouse → Warehouse, Lakehouse SQL EP → Lakehouse SQL EP, i mezi nimi navzájem (od 2024).

Shortcuts pro cross-workspace, cross-cloud

SCHÉMA
Lakehouse → New shortcut → OneLake / ADLS Gen2 / S3 / GCS
→ Pointer na external storage, žádná kopie dat
→ Tabulka se objeví v Tables/ jako kdyby byla lokální
→ Stejné SQL queries fungují

Příklad: firma má hlavní data v centrální workspace (HQ), divizní teams si přes Shortcuts vytvoří read pointer. Žádná duplicita, žádná latence sync, ovládání access přes workspace permissions.

5.5

Warehouse vs SQL Server — co účastníci se SQL backgroundem MUSÍ vědět

Nejdůležitější sekce dokumentu. Pokud někdo vyleze z kurzu jen s tímto, vím že to bylo užitečné.

Co chybí / je jiné

4.1 Žádné clustered rowstore indexy

Warehouse má jen sloupcové indexy auto-managed. Není CREATE CLUSTERED INDEX. Optimalizace je v partitioning + V-Order, ne v indexech.

SQL
-- TOTO NEFUNGUJE
CREATE CLUSTERED INDEX IX_Sales ON FactSales (OrderDate);  -- Error

-- Místo toho: partitioning při tvorbě (auto), V-Order
-- Engine si rozhoduje sám.
💡
Důsledek: zapomeň na index tuning. Optimalizuj fyzické rozložení (partitioning přes Spark), filter pushdown, columnstore-friendly query patterns.

4.2 Temp tabulky: jen session-scoped #temp

Session-scoped #temp tabulky Warehouse podporuje (od 2025); globální ##temp ne a mají svá omezení (viz dokumentace Temp tables). Pro většinu ETL v procedurách je i tak čistší CTE nebo staging schema:

SQL
-- Session-scoped #temp funguje (globalni ##temp ne):
CREATE TABLE #StagingData (id INT, val VARCHAR(50));

-- Alternativy:
-- a) CTE (preferred pro single-query)
WITH StagingData AS (
    SELECT id, val FROM source WHERE ...
)
SELECT * FROM StagingData JOIN dim ON ...;

-- b) Persistent tabulka v dedicated schema
CREATE SCHEMA staging;
CREATE TABLE staging.tmp_orders (...);
-- ... use ...
DROP TABLE staging.tmp_orders;

-- c) Inline derived table
SELECT *
FROM (SELECT id, val FROM source WHERE ...) AS s
JOIN dim ON ...;
💡
Best practice: všude používej CTE (WITH ... AS). Pokud potřebuješ persist přes několik queries, použij staging schema s explicit DROP.

4.3 Stored procedures — co funguje a co ne

Funguje Nefunguje
Standard T-SQL DML OPENROWSET / OPENQUERY
Parametry (in/out) sp_executesql nad linked servers
TRY/CATCH xp_cmdshell
Transactions (BEGIN TRAN) Sjednocené return values přes RETURN
RAISERROR THROW (částečně, nestabilní)
Cursors — nejsou v dokumentovaném T-SQL surface, ověřte; i kdyby prošly, jsou v MPP enginu pomalé –
Dynamic SQL přes EXEC sp_executesql –
MERGE statement –

Anti-pattern:

SQL
-- Funguje, ale CURSOR je v MPP enginu pomalý.
-- Místo toho přepiš na set-based:
DECLARE c CURSOR FOR ...;
OPEN c;
FETCH NEXT FROM c ...;
WHILE @@FETCH_STATUS = 0 ...

4.4 Žádný SQL Agent / SSIS

Place pro orchestraci je Pipeline (Data Factory pipelines v Fabricu).

Co děláš v SQL Serveru Ekvivalent ve Fabric
SQL Agent Job Pipeline + Schedule trigger
SSIS Package Pipeline activities (Copy, Stored Procedure, ForEach, If)
SSIS Lookup Pipeline Lookup activity
SSIS Conditional Split Pipeline If Condition
SSIS Script Task Pipeline Script activity (limited)
SSIS ForEach Pipeline ForEach activity
SQL Mail Pipeline → Office 365 Outlook activity / Webhook
ℹ️
Poznámka: přepis SSIS na Pipeline je doslovný, ale UI je jiný. Existuje migrace nástroj v ADF Studio, který projde SSIS dtsx a převede ho. Zmínit, ale neřešit detail v Day 1.

4.5 Žádný Linked Server, žádný OPENROWSET na external

Místo Linked Server → Three-part naming (viz §3).

Místo OPENROWSET pro CSV → COPY INTO statement:

SQL
-- SQL Server style (NEFUNGUJE ve Warehouse):
SELECT * FROM OPENROWSET(BULK 'C:\data\file.csv', SINGLE_CLOB) AS T;

-- Fabric Warehouse:
COPY INTO dbo.staging
FROM 'https://onelake.dfs.fabric.microsoft.com/<workspace>/<lakehouse>/Files/file.csv'
WITH (FILE_TYPE = 'CSV', FIELDTERMINATOR = ',');

4.6 T-SQL dialekt odchylky (vybrané)

Funkce / pattern SQL Server Fabric Warehouse
SELECT INTO Ano Ano
IDENTITY(1,1) při CREATE Ano Ano, ale auto-increment není guaranteed sequential
PRIMARY KEY ENFORCED Default Pouze NOT ENFORCED — slouží jen jako metadata
FOREIGN KEY Vynucený Pouze NOT ENFORCED
CHECK constraints Ano Ne
UNIQUE constraints Vynucený Pouze NOT ENFORCED
DEFAULT constraints Ano Ne (doplňte hodnotu v INSERT / proceduře)
MERGE statement Ano Ano
BIT data type Ano Ano
SMALLDATETIME Ano Ne (use DATETIME2)
MONEY / SMALLMONEY Ano Ne (use DECIMAL)
XML data type Ano Ne
ROWVERSION / TIMESTAMP Ano Ne
IF EXISTS (SELECT...) Ano Ano
TOP (n) WITH TIES Ano Ano
OUTPUT clause v INSERT/UPDATE Ano Ne
Window functions Plné Plné
STRING_AGG Ano Ano
STRING_SPLIT Ano Ano
JSON_VALUE / OPENJSON Ano Ano
⚠️
Klíčové úskalí: unenforced constraints. Když dělaš INSERT s duplicitou v PK, insert projde. Validaci dělej v procedure před INSERTem nebo přes pipeline data quality check.
SQL
-- Fabric Warehouse: PK NOT ENFORCED
CREATE TABLE dbo.dim_kraj (
    kraj_id INT NOT NULL PRIMARY KEY NOT ENFORCED,
    kraj_nazev VARCHAR(50)
);

-- Tohle PROJDE bez chyby:
INSERT INTO dbo.dim_kraj VALUES (1, 'Praha');
INSERT INTO dbo.dim_kraj VALUES (1, 'Druhá Praha');  -- duplicita PK = OK

Pattern pro vynucení:

SQL
-- Idempotent insert s anti-join
INSERT INTO dbo.dim_kraj (kraj_id, kraj_nazev)
SELECT s.kraj_id, s.kraj_nazev
FROM staging.dim_kraj_new s
LEFT JOIN dbo.dim_kraj t ON t.kraj_id = s.kraj_id
WHERE t.kraj_id IS NULL;

4.7 Žádné variables typu BLOB / FILESTREAM

VARBINARY(MAX) funguje, ale FILESTREAM ne. Pro velké binární data (obrázky, PDFs) → ulož do Lakehouse Files, v tabulce drž jen path.

4.8 Tempdb — implicitní, neviditelný

V SQL Serveru ladíte tempdb manualně (multiple files, location). Ve Fabricu to engine řeší automaticky. Nevidíte jeho existenci v UI. Nelze hintovat. Důsledek: některé tuning techniky (např. forcing parallelism, query hints) prostě nejsou.

5.6

Lakehouse SQL Endpoint — co umí a neumí

Co umí

SQL
-- Vše čtecí: SELECT, JOINs, window funkce, aggregace
SELECT YEAR(date) AS rok, COUNT(*) AS pocet
FROM nehody_silver
GROUP BY YEAR(date)
ORDER BY rok DESC;

-- Views
CREATE VIEW v_nehody_summary AS
    SELECT rok, kraj_nazev, COUNT(*) AS pocet
    FROM nehody_silver
    GROUP BY rok, kraj_nazev;

-- Stored procedures (read-only)
CREATE PROCEDURE sp_kraj_summary @rok INT
AS
    SELECT kraj_nazev, COUNT(*) AS pocet
    FROM nehody_silver
    WHERE rok = @rok
    GROUP BY kraj_nazev;

Co neumí

SQL
-- Žádný write
INSERT INTO nehody_silver ... ;        -- Error
UPDATE nehody_silver SET ... ;         -- Error
DELETE FROM nehody_silver WHERE ... ;  -- Error
CREATE TABLE ...;                       -- Error
TRUNCATE TABLE ...;                     -- Error

Pro write do Lakehouse: notebook (Spark / Python), Dataflow Gen2, Pipeline. SQL endpoint je striktně read-only fasáda.

5.7

Praktické patterns pro SQL tým

Pattern A: SQL Database jako landing pro app data

SCHÉMA
Aplikace → SQL Database → Mirroring → OneLake → Power BI

Mirroring (od 2024) replikuje SQL DB do OneLake near real-time bez CU spotřeby. App neví o Fabricu, BI tým má fresh data.

Pattern B: Lakehouse + Warehouse hybrid

SCHÉMA
CSVs / sources → Lakehouse Files (Bronze)
                    ↓ Spark/PQ
                Lakehouse Tables (Silver)
                    ↓ T-SQL procedures
                Warehouse (Gold)
                    ↓
                Power BI Direct Lake

Bronze v Lakehouse (cheap, raw, schema-on-read). Silver v Lakehouse (Delta, schema-on-write). Gold ve Warehouse (T-SQL friendly, OLAP optimization).

Pattern C: Pure Warehouse pro SQL-only tým

SCHÉMA
SQL sources (mirror nebo COPY INTO) → Warehouse Bronze schema
                                        ↓ stored procedures
                                      Warehouse Silver schema
                                        ↓ stored procedures
                                      Warehouse Gold schema
                                        ↓
                                      Power BI

Tohle je nejnižší overhead pro SQL Server team — celá stack v T-SQL. Tradeoff: některé operace (např. JSON parsing, semi-structured) budou pomalejší než v Spark.

5.8

Checklist pro migraci ze SQL Serveru

Když firma zvažuje "přesun DWH do Fabricu", projdi:

  • ☐ Inventory stored procedur: kolik, co používají (linked servers, openrowset, xp_cmdshell)
  • ☐ Inventory SQL Agent jobů → mapování na Pipelines
  • ☐ Inventory SSIS packages → mapování na Pipelines (nebo migrate tool)
  • ☐ Inventory CHECK constraints → přepsat na validation v procedure / pipeline
  • ☐ Inventory ##temp (globálních) tabulek → přepsat na session #temp, CTE nebo persist staging
  • ☐ Inventory TRIGGERS → přepsat na pipeline / change feed pattern (Fabric nemá)
  • ☐ Inventory DBMail / SQL Mail → Office 365 connector v pipeline
  • ☐ Indexy: zkontrolovat, kolik clustered rowstore vs nonclustered → ve Fabricu se vším rozhodne engine
  • ☐ Partitioning existing tables — zda velikost a partition strategie sedne na V-Order