SQL trojúhelník
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
Ú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.
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
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í
┌─── 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 / ADSKdy 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 |
Cross-database queries — Linked Servers nahrazeny Shortcuts
V SQL Serveru řešili Linked Servers. V Fabric Warehouse:
Three-part naming
-- 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
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.
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.
-- 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.
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:
-- 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 ...;
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:
-- 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 |
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 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 |
-- 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í:
-- 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.
Lakehouse SQL Endpoint — co umí a neumí
Co umí
-- 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í
-- Žá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.
Praktické patterns pro SQL tým
Pattern A: SQL Database jako landing pro app data
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
CSVs / sources → Lakehouse Files (Bronze)
↓ Spark/PQ
Lakehouse Tables (Silver)
↓ T-SQL procedures
Warehouse (Gold)
↓
Power BI Direct LakeBronze 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
SQL sources (mirror nebo COPY INTO) → Warehouse Bronze schema
↓ stored procedures
Warehouse Silver schema
↓ stored procedures
Warehouse Gold schema
↓
Power BITohle 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.
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
Reference
- Warehouse T-SQL surface: https://learn.microsoft.com/fabric/data-warehouse/tsql-surface-area
- Warehouse limitations: https://learn.microsoft.com/fabric/data-warehouse/limitations
- Lakehouse SQL Endpoint: https://learn.microsoft.com/fabric/data-engineering/lakehouse-sql-analytics-endpoint
- SQL Database in Fabric: https://learn.microsoft.com/fabric/database/sql/overview
- Mirroring: https://learn.microsoft.com/fabric/database/mirrored-database/overview
- Cross-database queries: Query the Warehouse (vč. cross-database)