Markus Winand: SQL Performance Explained

8. 7. 2013
Doba čtení: 3 minuty

Sdílet

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í.

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í.

ict ve školství 24

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

Autor článku

Pavel Stěhule je odborníkem na relační databázový systém PostgreSQL, pracuje jako školitel a konzultant.