SQL v moderní době: novinky a pokročilé techniky

SQL v moderní době: novinky a pokročilé techniky
Softwarová Architektura – odborný článek redakce Informatika.cz.

Abstrakt: Předpovědi o konci jazyka SQL se v posledních dvou desetiletích objevují s pravidelností, která dnes působí spíše jako kulturní jev než jako odborná prognóza. Postupně přicházely XML databáze, vlna NoSQL i takzvané NewSQL systémy, žádný z těchto směrů však relační databáze nenahradil. Naopak, moderní SQL absorbovalo řadu předností konkurenčních přístupů a nabízí dnes nástroje, které před deseti lety vyžadovaly specializované technologie. Článek shrnuje hlavní novinky standardů SQL:2016 a SQL:2023, představuje pokročilé techniky jako okenní funkce, rekurzivní CTE a práci s formátem JSON a uvádí praktická doporučení pro výkon a údržbu.

1. Úvod: relační renesance

NoSQL vlna z přelomu desetileté začala odpovědí na konkrétní omezení tehdejších relačních databází: horizontální škálovatelnost, flexibilní schéma a rychlost vývoje. Po několika letech zkušeností se však ukázalo, že většina podnikových dat zůstává relační povahy, ACID transakce nepředstavují přežitek a chybějící schéma se časem mění z výhody v zátěž.

Mezitím relační databáze postupně přejaly to, co u NoSQL fungovalo. PostgreSQL nabízí v typu jsonb práci s dokumenty, která co do výkonu i možností konkuruje specializovaným databázím. Oracle integroval grafový dotazovací jazyk, Microsoft SQL Server vestavěné strojové učení a všechny tři systémy zvládají horizontální škálování formou shardingu nebo distribuovaných rozšíření. SQL se z prostého dotazovacího jazyka stalo platformou, která pokrývá relační, dokumentové, grafové i analytické dotazy v jednom systému.

Standardy SQL:2016 a SQL:2023 tento posun kodifikovaly. SQL:2016 zavedl standardní funkce pro práci s formátem JSON, takže přenos dotazů mezi databázemi již není závislý na nestandardních rozšířeních. SQL:2023 přidal grafové dotazy v podobě SQL/PGQ a vícerozměrná pole v SQL/MDA, čímž se ze SQL stává univerzální dotazovací jazyk pro většinu typů dat v podnikové praxi.

2. Okenní funkce: analytika bez složitých spojení

Okenní funkce patří k nejvýznamnějším přírůstkům posledních dvou dekád. Nahrazují řadu konstrukcí, které se dříve řešily samospojováním tabulek, dočasnými tabulkami nebo procedurálními cykly. Princip je jednoduchý: funkce se vyhodnocuje nad oknem definovaným klauzulemi PARTITION BY a ORDER BY, aniž by docházelo k seskupování řádků.

Typické úlohy zahrnují kumulativní součty, klouzavé průměry, žebříčky a porovnání s předchozí nebo následující hodnotou. Ukázkový dotaz pro analýzu prodejů kombinuje běžící součet, denní žebříček, sedmidenní klouzavý průměr a meziroční porovnání:

``sql SELECT product_id, sale_date, amount, SUM(amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS running_total, RANK() OVER (PARTITION BY DATE(sale_date) ORDER BY amount DESC) AS daily_rank, AVG(amount) OVER (PARTITION BY product_id ORDER BY sale_date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_avg_7d, LAG(amount) OVER (PARTITION BY product_id ORDER BY sale_date) AS previous_amount FROM sales; ``

V analytických scénářích, jako je kohortní analýza retence uživatelů nebo segmentace zákazníků, dokáží okenní funkce nahradit desítky řádků procedurálního kódu jediným srozumitelným dotazem. Výkonnostně bývají v moderních databázích lépe optimalizované než ekvivalentní samospojení, protože plánovač je dokáže vyhodnotit jediným průchodem dat.

3. Common Table Expressions a rekurze

Konstrukce WITH, formálně označovaná jako Common Table Expression, výrazně zlepšila čitelnost komplexních dotazů. Místo vnořených poddotazů, které je třeba číst od středu, lze definovat pojmenované bloky a poskládat z nich výsledný dotaz lineárně. Sekvence WITH active_users AS (...), user_payments AS (...) SELECT ... čtenář pochopí na první pohled, kdežto ekvivalentní zápis se třemi úrovněmi vnoření bývá nesrozumitelný.

Rekurzivní varianta CTE otevírá práci s hierarchickými strukturami, která dříve vyžadovala procedurální jazyky nebo speciální datové typy. Typickými scénáři jsou organizační stromy, kusovníky výrobků, navigační menu nebo grafy závislostí. Rekurzivní dotaz se skládá z kotvící části, která definuje výchozí řádky, a rekurzivní části, která je opakovaně rozšiřuje na základě již spočtených dat. Důležité je ošetřit zacyklení, typicky kontrolou cesty pomocí pole nebo omezením maximální hloubky rekurze.

V manufakturních systémech používáme rekurzivní CTE pro takzvanou explozi kusovníku: rozklad finálního produktu na všechny komponenty se zachováním kumulativního množství a nákladů. Tentýž princip slouží i pro výpočet všech podřízených v organizační struktuře nebo pro vyhodnocení dopadu změny v grafu závislostí balíčků.

4. JSON v relační databázi

Datový typ jsonb v PostgreSQL představuje jednu z nejvýznamnějších změn posledního desetiletí. Umožňuje ukládat a indexovat dokumenty s flexibilním schématem, aniž by se firma musela vzdát relačních záruk pro zbytek dat. V mnoha scénářích, zejména pro audit logy, eventy a externí API odpovědi, je výhodné kombinovat strukturované sloupce s jedním sloupcem typu jsonb pro proměnlivé části datového modelu.

Indexace pomocí GIN umožňuje rychlé vyhledávání podle obsahu dokumentu, včetně dotazů na konkrétní klíče, výskyt hodnot v polích nebo plnotextové prohledávání. Typický dotaz nad event-sourcing tabulkou kombinuje filtraci podle typu události, extrakci hodnot z JSON a agregaci stejně přirozeně, jako kdyby šlo o klasické sloupce:

``sql SELECT event_data->>'customerId' AS customer_id, SUM((event_data->>'totalAmount')::numeric) AS total_spent FROM events WHERE event_type = 'OrderPlaced' AND created_at >= CURRENT_DATE - INTERVAL '30 days' GROUP BY 1; ``

PostgreSQL od verze 14 podporuje validaci JSON schématu pomocí funkce jsonb_matches_schema, kterou lze použít přímo v omezení CHECK. Tím se z formálně beztvarého sloupce stává sloupec s vynucovanou strukturou, která chrání data před chybami v aplikační vrstvě.

5. Pattern matching a temporální tabulky

SQL:2016 zavedl konstrukci MATCH_RECOGNIZE, která umožňuje hledat sekvence v uspořádaných datech. Dotaz definuje vzor pomocí regulárních výrazů nad pojmenovanými stavy a pro každý nález vrací zvolené měřitelné hodnoty. Typickými použitími jsou detekce podezřelých transakcí, identifikace technických vzorů v časových řadách nebo analýza uživatelských cest na webu. Oracle podporuje tuto funkci od verze 12c, PostgreSQL ji nabízí v rozšíření od verze 15.

Systémově verzované tabulky podle SQL:2011 řeší problém uchovávání historie změn deklarativně. Tabulka má dvojici sloupců s časovým rozsahem platnosti a databáze sama při každé úpravě zapisuje předchozí verzi do historizační tabulky. Dotazy pak mohou pomocí klauzulí jako FOR SYSTEM_TIME AS OF přistupovat k libovolnému stavu v minulosti, což výrazně zjednodušuje audit a vyšetřování incidentů.

6. Výkonnostní techniky v praxi

Kvalitní indexová strategie zůstává základem výkonu. PostgreSQL od verze 11 nabízí klauzuli INCLUDE, která umožňuje vytvořit takzvaný covering index obsahující dodatečné sloupce mimo klíč. Výsledný index je menší než klasický kompozitní a přitom umožňuje takzvané Index-Only Scans, které čtou data výhradně z indexu bez přístupu k tabulce.

Deklarativní partitioning, dostupný v PostgreSQL od verze 10, řeší správu velkých tabulek s časovou osou. Tabulky se rozdělují podle data, regionu nebo jiného přirozeného klíče a databáze sama směruje dotazy na relevantní oddíly. Automatizace tvorby měsíčních nebo denních oddílů pomocí pravidelně spouštěné procedury je dnes standardem pro logy a auditní data.

Materializované pohledy s možností průběžného obnovování pomocí REFRESH MATERIALIZED VIEW CONCURRENTLY jsou užitečné pro předpočítané agregace, které jsou drahé na výpočet, ale dotazované velmi často. Typicky jde o denní statistiky, dashboard metriky nebo souhrnné reporty pro vedení.

7. Strojové učení v databázi

Integrace strojového učení přímo do databázového stroje představuje další směr vývoje. PostgreSQL nabízí rozšíření MADlib s desítkami statistických a strojově učících algoritmů, Microsoft SQL Server podporuje skripty v jazyce R a Python přímo v dotazech, Oracle integroval Machine Learning v rámci své Autonomous Database. Výhodou je odpadnutí přesunu dat do externího systému, což u velkých datasetů ušetří hodiny zpracování i otázky bezpečnosti dat.

V praxi se osvědčuje použít databázové ML pro úlohy, kde data zůstávají v databázi a model je relativně jednoduchý: lineární a logistická regrese, shlukování, detekce anomálií. Pro hluboké neuronové sítě a komplexní pipelines zůstávají specializované nástroje vhodnější.

8. Závěr

Vývoj posledních dvaceti let ukázal, že SQL není zastaralá technologie, ale živá platforma, která trvale přejímá nejlepší praktiky z konkurenčních přístupů. Moderní relační databáze kombinují relační integritu, dokumentovou flexibilitu, analytické funkce a výkonové optimalizace na úrovni, která pro většinu podnikových scénářů odstraňuje potřebu specializovaných systémů.

Před nasazením nové technologie se vyplatí ověřit, zda požadovanou funkci nepokrývá již používaná databáze. V drtivé většině případů se ukáže, že ano, a výsledné řešení je provozně jednodušší, levnější a stabilnější než přidávání dalších systémů do již tak složité architektury.

Doporučená literatura

  • Winand, M. (2012): SQL Performance Explained
  • Karwin, B. (2010): SQL Antipatterns. Pragmatic Bookshelf
  • Molinaro, A. (2020): SQL Cookbook, 2nd Edition. O'Reilly
  • Ben-Gan, I. (2019): T-SQL Window Functions For Data Analysis. Microsoft Press
  • Modern SQL: https://modern-sql.com/
  • Use The Index, Luke: https://use-the-index-luke.com/

Další z tématu Softwarová Architektura

Zobrazit vše