Hlavní navigace

Markus Winand: SQL Performance Explained

Pavel Stěhule

Při svých školeních vidím, že se překvapivě hodně vývojářů nedokáže jednoduše vymanit z limitů, které jsou vlastní technologii, kterou při své běžné práci denně používají. Jsou příliš zafixovaní na jednu technologii, což jim pak překáží efektivně řešit případné výkonnostní problémy moderních databází.

Doba čtení: 3 minuty

Všeobecně chybí základní znalosti datových struktur – co je to hash, strom, pole a jaké jsou jejich vlastnosti a vhodné nasazení. Chybí znalosti a schopnosti psaní si vlastních specializovaných serverů – což má důsledek v neefektivním využití paměti a CPU. Úplně by postačila schopnost vývoje primitivních serverů typu memcache. Chybí schopnost správně vybrat technologie vůči předpokládanému charakteru provozu a objemu zpracovaných dat.

Pro běžnou praxi není nutné mít akademické vzdělání a rozumět úplně všemu (nehledě na to, že takový tu snad nikdo ani není). Určitě je ale vhodné mít základy pro každou používanou technologii a vědět něco i o věcech, které se zrovna ve firmě nepoužívají. Relační databáze jsou jednou z nejčastěji chybně používaných technologií. Jsou relativně user friendly (ostatně za tímto účelem bylo SQL navrženo), a tak s databázemi může velice rychle dělat každý bez proškolení. To ale může svádět k mylným domněnkám a nepříjemným překvapením. To když dojde na lámání chleba a databáze se nepříjemně zvětší. Pak už ty znalosti nutné jsou. Alespoň základní, nebo ještě lépe minimální nezbytné. Ke studiu nejsou nutné drahé kurzy, stačí kvalitní literatura. A zrovna jednu knihu si dovolím doporučit, jelikož v čitelném rozsahu (zhruba 200 stran) přináší základní přehled znalostí nezbytných pro efektivní práci s databázemi.

S jejím autorem Markusem Winandem jsem se potkal na letošním P2D2 a měl jsem čas se s ním bavit o jeho práci. Zjistili jsme, že máme úplně stejné zkušenosti – velká část problémů s výkonem je relativně jednoduše řešitelná a jejich příčinnou jsou chybějící základní znalosti (částečně teorie, částečně řemesla) a mylné předpoklady (např předpoklad, že se Oracle bude chovat stejně jako MSSQL Server). Markusova kniha se mi líbí i proto, že přehledně popisuje základy rovnou pro čtyři databazové systémy: MySQL, Oracle, PostgreSQL a MSSQL Server (řazeno abecedně). A to aniž by některé databázi nadržoval (i když hodně prostoru dostává Oracle – díky některým svým hodně specifickým a zvláštním funkcím). To mi přijde hodně dobré a praktické – mezi těmito databázemi jsou velké rozdíly (i když je spojuje SQL) a je důležité to akceptovat (a vědět (tušit) v čem, kde, a kdy může být problém).

První kapitola se jmenuje Anatomie indexů. Všichni programátoři vědí, že indexy urychlují provádění dotazů. Ale už ne každý programátor ví, jak indexy fungují a co reálně dělají. Druhá a patrně nejdelší kapitola je zaměřená na klauzuli WHERE příkazu SELECT. Autor zde vysvětluje, proč některé (a programátory oblíbené) způsoby zápisu podmínky efektivně blokují použití indexů a jsou důvodem, proč je dotyčný dotaz pomalý. Hezký příklad je ze strany 66:

-- a. špatně
SELECT ...
   FROM sales
  WHERE to_char(sale_date, 'YYYY-MM-DD') = '1970-01-01'

--b. dobře
SELECT
   FROM sales
  WHERE sale_date = to_date('1970-01-01', 'YYYY-MM-DD');

Tento příklad je hodně názorný – neproškoleného vývojáře to netrkne, ale zkušenějšímu nebo proškolenému vývojáři by při pohledu na příklad (a) měla naskakovat husí kůže.

Krátká třetí kapitola je věnovaná otázkám výkonu a škálování a je spíš seznámením s všeobecně používanou terminologií. Čtvrtá kapitola se věnuje spojování relací – joinům. Jsou zde vysvětleny nejčastější implementace spojení relací – nested loop, hash join a merge join. Pátá kapitola je věnovaná speciálním formátům dat a technikám umožňujícím rychlejší přístup k datům – index only scan, index organized tables atd. V další kapitole se čtenář seznámí s implementací řazení a agregace. V sedmé kapitole se autor věnuje tzv. TOP n dotazům a stránkování výsledků (S přednáškou věnovanou nevhodnému používání klauzulí LIMIT a OFFSET vystoupil na letošním P2D2). Poslední kratší kapitola je věnovaná modifikacím dat – příkazům INSERT, UPDATE a DELETE. V příloze pak čtenář najde stručný návod, jak číst prováděcí plány v knize zmíněných databází.

MIF18 tip v článku témata

Na Markusovi se mi líbí, že je přímočarý. Recenzovaná kniha neobsahuje žádnou vatu – a že je útlá, tak by mohla být i naděje, že si přečtou ti, kterým je určena – vývojáři, kteří používají SQL relační databáze, které jsou, zatím, pro ně černou skříňkou. Má to smysl, protože je relativně obtížné dostat z databází maximum, ale je poměrně snadné (stačí neházet databázi klacky pod nohy a programovat s trochou fištrónu) dostat z databáze dost na to, aby byli uživatelé spokojeni.

Informace o knize

Název: SQL Performance Explained
Autor: Markus Winand
Jazyk: angličtina
Počet stran: 204
Vydavatel: Markus Winand
Rok vydání: 2012
Vazba: brožovaná
ISBN: 978–3–9503078–2–5

Našli jste v článku chybu?