Optimalizace Ing. Marek Sušický RNDr. Ondřej Zýka marek.susicky@prfinit.eu ndrej.zyka@prfinit.eu 2014 Prfinit. All rights reserved.
Obsah Úvd Indexy Optimalizátr Jiny Bulk perace Pekl jménem ORM (Object-relatinal mapping) 2014 Prfinit. All rights reserved. 2
1 Úvd 2014 Prfinit. All rights reserved.
Optimalizace Dvě pravidla ptimalizace: pravidl č. 1: Nedělejte ji. pravidl č. 2: Zatím ji nedělejte. Tím není myšlen že nemáte ptimalizvat, ale abyste nedělali premature ptimizatin (předčasnu ptimalizaci), v jejímž jméně se páchají různá zvěrstva bez skutečné ptřeby (řešící neexistující prblém) Primárně prgramujte (vytvřte DB schéma, napište PL/SQL kód) tak aby dával lgický smysl a aby vracel správné výsledky Až pkud máte dzkušen že v daném prcesu je výknnstní prblém, teprve pak přistupte k ptimalizaci a řešte h 2014 Prfinit. All rights reserved. 4
Optimalizace ladění prcesu se bude velmi lišit pdle th c vlastně máte výknem na mysli prpustnst cílem je maximální rychlst zpracvání všech dat latence cílem je minimální latence jedntlivých pžadavků škálvatelnst cílem je prces napsat tak aby dbře fungval i při navýšení mnžství vstupních dat / sučasně pracujících uživatelů apd. čast se zapmíná že neplatí rvnst mezi vysku prpustnstí a nízku latencí (při vyské prpustnsti se čast stává že latence zpracvání některých pžadavků dsahuje neakceptvaných hdnt ) v pdstatě záleží na tm jestli ladíte interaktivní neb batch prces, batch prcesy se ladí na celkvu prpustnst, interaktivní na nízku latenci 2014 Prfinit. All rights reserved. 5
Brzdy výknu pmalé SQL dtazy (tradičně) algritmické brzdy spusta maličkých dtazů (ruční jinvání, kntext switche) zbytečné změny dat 2014 Prfinit. All rights reserved. 6
Základní dpručení načítejte data zjinvaná namíst ručníh jinvání nechte t na DB (určitě t nedkážete lépe) prvádějte minimum zápisů sesbírejte si změny z celéh (vhdně setříděnéh) batche šetří úpravy indexů, zápisy d und/red pužívejte BULK perace (viz. dále 2014 Prfinit. All rights reserved. 7
Základní dpručení rzdrbení na maličké selecty je čast důsledkem naivníh přepisu business prcesu d PL/SQL pdby, např. načtěte infrmace transakci načtěte infrmace pbčce na které byla transakce zadána načtěte infrmace zákazníkvi na jehž účtu byla transakce prvedena může být realizván pmcí jednh SQL dtazu a neb pmcí tří SQL každý SQL příkaz má určitu režii a t i když se jedná sft-parse ( hardparse ani nemluvě. tam je t ještě hrší) databáze má jinvání pladěné, dkáže h ptimalizvat pmcí vhdnéh algritmu (v závislsti na mnžství dat zvlí nested lp, merge jin, hash jin apd.) jedntlivé SQL čast skluznu na hrmadu index scanů, které jsu pměrně nákladné kvůli randm I/O peracím, a ve výsledku je ruční jin výrazně hrší než skutečný jin 2014 Prfinit. All rights reserved. 8
Příklad špatně: načítání dat pmcí malých selectů FOR t IN (SELECT * FROM transakce) LOOP FOR u IN (SELECT * FROM ucet WHERE id = t.ucet_id) LOOP -- nejake zpracvani END LOOP; END LOOP; dbře: načítání dat v jednm jinu FOR x IN (SELECT * FROM transakce t JOIN ucet u ON (t.ucet_id = u.id)) LOOP -- nejake zpracvani END LOOP; 2014 Prfinit. All rights reserved. 9
špatně: zpracvání batche s update pr každý záznam FOR t IN (SELECT ucet_id, vyse FROM transakce) LOOP UPDATE ucet SET aktualni_stav = aktualni_stav + vyse WHERE id = t.ucet_id; END LOOP; dbře: knslidace zápisů FOR t IN (SELECT ucet_id, SUM(vyse) AS vyse FROM transakce GROUP BY ucet_id) LOOP UPDATE ucet SET aktualni_stav = aktualni_stav + vyse WHERE id = t.ucet_id; END LOOP; 2014 Prfinit. All rights reserved. 10
2 Indexy 2014 Prfinit. All rights reserved.
Typy indexů Typ indexu B-tree index Hash index Bitmap index GIST index Fulltext index Pužití <, =, > (interval hdnt) Existence Pčet hdnt, prvek mnžiny Umžňuje definvat vlastní vyhledávací predikátry (pr multidimenzinální kstky ) Textvé zpracvání Lkální a glbální indexy Struktury pr in-memry databáze Speciální datvé struktury (grafvé databáze) 2014 Prfinit. All rights reserved. 12
Indexy Kdy řešit definici a pužití indexů Jak se chvá null v indexu? Jaký je rzdíl mezi ASC a DESC? Datumy v indexech Záleží na přadí ve slžených indexech? Víc indexů = rychlejší databáze 2014 Prfinit. All rights reserved. 13
Indexy Přidávání a rušení indexů Nejčastěji prváděná úprava na straně vývjářů i administrátrů Přidání indexu zamyká tabulku dpad na prvz Mnh indexů zpmaluji změny v datech Indexy zabírají diskvý prstr Přegenervání stávajících indexů a přepčet statistik je sučást standardní administrace serveru vyžaduje čas Přidávání a rušení indexů Je jednduché zjistit, že se index v knkrétním příkazu pužívá Nedá se zjistit, v kterých příkazech se index pužívá definuje ptimalizátr Dá se zjistit, že se index někdy pužívá Dá se zjistit, které indexy by byly vhdné pr knkrétní příkaz přidat Nedá se zjistit, které indexy by šl vyhdit Nezapmenut na pkrývající indexy 2014 Prfinit. All rights reserved. 14
2 Optimalizátr 2014 Prfinit. All rights reserved.
Optimalizace Pr SQL dtaz ptimalizátr dhadne nejvhdnější exekuční plán Využití statistik stará statistika může i něklikařádvě zhršit výkn Módy ptimalizace Nejkratší čas dpvědi Největší průtk dat (default) Optimalizace pužívá statistiku Zastaralá statistika může výkn aplikace velice negativně vlivnit Optimalizaci lze vlivnit pužíváním tipů (Hint) NP-úplný prblém 2014 Prfinit. All rights reserved. 16
Optimalizátr Rzdělení dtazu d krků Vlba metdy přístupu k tabulkám Vlba přadí přístupu k tabulkám 2014 Prfinit. All rights reserved. 17
Exekuční plán Zbrazení exekučníh plánu Tabulka PLAN_TABLE Dynamický phled V$SQL_PLAN SQL analyzátr v Enterprise Manageru EXPLAIN PLAN statement Zálžka Executin plan v SQL Develperu SET AUTOTRACE ON SELECT * frm emplyee; EXPLAIN PLAN FOR SELECT * FROM emplyee; SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY()); 2014 Prfinit. All rights reserved. 18
Optimalizace Nejkratší čas dpvědi Prvedení dtazu tak, aby byl prvních n řádků nalezen nejrychleji Vhdné pr interaktivní aplikace Největší průtk dat Default mód pr Oracle Prvedení dtazu tak, aby byl celkvý výsledek získán s minimem zdrjů Vhdné pr aplikace v batch módu 2014 Prfinit. All rights reserved. 19
Optimalizace Metdu lze zvlit inicializačním parametrem Pr instance Čas dpvědi Init parameter: OPTIMIZER_MODE = first_rws_n ALTER SYSTEM SET OPTIMIZER_MODE = first_rws_n Průtk dat Init parameter: OPTIMIZER_MODE = all_rws ALTER SYSTEM SET OPTIMIZER_MODE = all_rws Pr sessin Čas dpvědi ALTER SESSION SET OPTIMIZER_MODE = first_rws_n Průtk dat ALTER SESSION SET OPTIMIZER_MODE = all_rws n pr first_rws_n může být 1, 10, 100 neb 1000 2014 Prfinit. All rights reserved. 20
Statistiky Pužívá ptimalizátr pr dhad nejlepšíh plánu Příklady statistik Tabulky (pčet řádku, pčet blků, průměrná délka řádku) Slupce: pčet různých hdnt, pčet NULL, histgram Indexy: Stránky, úrvně, cluster faktr Statistiky se neupravují ihned v rámci transakcí Přepčítávají se dávkvě v rámci administrace V pravidelných intervalech Manuálně p změněn dat ORACLE - PL/SQL package DBMS_STATS MS SQL příkaz update statistics 2014 Prfinit. All rights reserved. 21
Hinty Hint se zapisuje inline příkazů Pužívat jen v důvdněných případech Se změnu dat se může stát, že dtaz začne být extrémně neefektivní Kategrie hintů Cíl ptimalizace Metda přístupu Transfrmace dtazu Přadí jinů Způsb jinů Paralelní prvedení Další Executin plan Přesný ppis výpčtu Mžn přidělit k danému příkazu 2014 Prfinit. All rights reserved. 22
Prfiling Analýza chvání běhu aplikací Na úrvni celéh datvéh serveru Na úrvni jedntlivých příkazů Oracle - AWR reprt Funguje puze pr named library units Infrmace se sbírají na úrvni PL/SQL VM Sybase sp_sysmn prcedura 2014 Prfinit. All rights reserved. 23
2 Jin 2014 Prfinit. All rights reserved.
JOIN Typy jinů Nested lps Hash JOIN Merge JOIN Přadí jinvání ptimalizátr sám řeší přadí jinů n! mžnstí pr n tabulek Bere v úvahu velikst tabulek pčet kvalifikvaných slupců (selektivitu where pdmínek) existenci indexů existence statistik na jin slupcích (histgramy) přesnější dhad Strukturu tabulek (Index Organized Tables/Clustered index) Partitining tabulek (mžnsti paralelizace výpčtu) 2014 Prfinit. All rights reserved. 25
2 Bulk perace (Oracle) 2014 Prfinit. All rights reserved.
náhrada FOR smyček s DML peracemi jeden DML příkaz pr FORALL (jeden rzšířený příkaz) pužívá bind array ze kteréh se načítají hdnty libvlná klekce (ale indexvaná celým číslem) indexvané sekvenčně (lze bejít přes INDICES OF / VALUES OF) výsledky (pčet mdifikvaných řádek) tradiční cursr attributes SQL%ROWCOUNT celkvý pčet (nesplehlivé s LOG ERRORS) SQL%BULK_ROWCOUNT pčet pr každý příkaz 2014 Prfinit. All rights reserved. 27
Bulk perace - shrnutí asi nejzásadnější vlastnst týkající se výknu něc za něc : vyšší slžitst za vyšší výkn nvější verze autmatizují (10g cursr fr lps ) pzr na paměť - data se ukládají d PGA 2014 Prfinit. All rights reserved. 28
Bulk perace zpracvání velkéh pčtu řádek prblém s přepínáním kntextu (SQL PL/SQL) řešení seskupit načítání a zápisy dat zalžen na klekcích FORALL mdifikace dat (INSERT, UPDATE, DELETE, MERGE) zápis dat z klekcí d databáze BULK COLLECT načítání dat z tabulek d klekcí implicitní i explicitní dtazy 2014 Prfinit. All rights reserved. 29
Příklad - tradiční DECLARE TYPE data_t IS TABLE OF mje_tabulka%rowtype; v_data data_t := data_t(); BEGIN END; FOR v_rec IN (SELECT * FROM mje_tabulka) LOOP v_data.extend; v_data(v_data.last) := v_rec; END LOOP; 2014 Prfinit. All rights reserved. 30
Příklad - BULK DECLARE TYPE data_t IS TABLE OF mje_tabulka%rowtype; v_data data_t := data_t(); BEGIN END; SELECT * BULK COLLECT INTO v_data FROM mje_tabulka; 2014 Prfinit. All rights reserved. 31
Bulk cllect pr dtazy i kurzry : INTO => BULK COLLECT INTO klekce se vždy plní sekvenčně d hdnty 1 nevyhazuje výjimku NO_DATA_FOUND znáte max. pčet záznamů => varray LIMIT neb velikst tabulky pkud velikst nestačí, tak výjimka jinak nested table neb index-by table ptimální velikst LIMIT závisí na situaci mnžství paměti, pčet prcesů,... 2014 Prfinit. All rights reserved. 32
nelze pužít %NOTFOUND hned p fetchi přesunut %NOTFOUND na knec smyčky p fetchi spčítat elementy v klekci (0 => knec) na knci spčítat elementy v klekci (< limit => knec) kdy převést tradiční fetch na BULK COLLECT před 10g vždy (včetně cursr fr lps ) d 10g není třeba převádět cursr fr lps pkud nebsahují DML perace běží dstatečně rychle 2014 Prfinit. All rights reserved. 33
Příklad - tradiční DECLARE TYPE data_t IS TABLE OF mje_tabulka%rowtype; v_data data_t := data_t(); BEGIN v_data.extend(10); v_data(1).id := 1; v_data(1).hdnta := 'a'; /* atd pr další hdnty */ FOR idx IN v_data.first.. v_data.last LOOP UPDATE mje_tabulka SET hdnta = v_data(idx).hdnta WHERE id = v_data(idx).id; END LOOP; END; 2014 Prfinit. All rights reserved. 34
Příklad - FORALL DECLARE TYPE data_t IS TABLE OF mje_tabulka%rowtype; v_data data_t := data_t(); BEGIN v_data.extend(10); v_data(1).id := 1; v_data(1).hdnta := 'a'; /* atd pr další hdnty */ END; FORALL idx IN v_data.first.. v_data.last UPDATE mje_tabulka SET hdnta = v_data(idx).hdnta WHERE id = v_data(idx).id; 2014 Prfinit. All rights reserved. 35
8 ORM 2014 Prfinit. All rights reserved.
ORM Autmatický převd mezi bjektvým mdelem v aplikaci a relačním mdelem v databázi. Řeší jak strukturu tak manipulaci s daty Pžadavek becnsti řešení vynucuje pužití becných patternů pr struktury a algritmy nízká efektivita. ORM není schpn pužít znalst kntextu. Čast prt nutné bcházet z důvdů ptimalizace. Prgramátr musí znát kntext a zárveň vědět jak ORM interně pracuje, jaký dpad bude mít změna parametrů. Kód píší vývjáři aplikace bez hlubší znalsti relačních databází. 2014 Prfinit. All rights reserved. 37
2014 Prfinit. All rights reserved. Diskuse