Optimalizace dotazů a databázové transakce v Oracle Marek Rychlý Vysoké učení technické v Brně Fakulta informačních technologií Ústav informačních systémů Demo-cvičení pro IDS 22. dubna 2015 Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 1 / 24
Obsah 1 Optimalizace plánů vykonávání 2 Materializovaný pohled Vytvoření materializovaného pohledu Použití materializovaného pohledu 3 ACID a ovládáná databázové transakce Zamykání databázových objektů Optimalizace práce s databází bez změny dotazů Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 2 / 24
(Execution Plan) SQL DML dotaz je po přijetí db. serverem zpracován a proveden. Zpracování zahrnuje parsování, analýzu a přiřazení zdrojům dat. Analýza zahrnuje tvorbu plánů vykonávání a výběr nejlepšího. Plány vykonávání jsou sestaveny na základě: způsobu použití tabulek a jejich sloupců (projekce, druhy spojení tabulek, predikáty, agregace, řazení, atd.) existujících indexů (zvažuje se také typ a smysluplnost použítí indexů, nejen jejich existence) přítomnosti tzv. hints v dotazu (tvůrce dotazu pomocí nich přikazuje, jak se dotaz má provést) minulých úspěšných plánů provedení podobných dotazů (plány jsou nějakou dobu uloženy v cache) statistik nad existujícími daty v databázi i provedenými dotazy (počet dat v tabulce, počet různých hodnot ve sloupci tabulky, atd.) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 4 / 24
Zapojení optimalizátoru vykonávání dotazů (diagram převzat z Database SQL Tuning Guide, Oracle Database Online Documentation 12cR1) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 5 / 24
Komponenty optimalizátoru vykonávání dotazů (diagram převzat z Database SQL Tuning Guide, Oracle Database Online Documentation 12cR1) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 6 / 24
Transformace dotazů před generováním plánů vykonávání je dotaz transformován transformace rozdělí dotaz na několik poddotazů (příklad vlevo s rozdělením podle OR) (diagram převzat z Database SQL Tuning Guide, Oracle Database transformace může také nahradit dotaz či jeho část (použité tabulky) dotazem na materializováný pohled (pokud existuje takový pohled a je to povoleno) Online Documentation 12cR1) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 7 / 24
Odhad ceny vykonávání dotazů ohodnocení pro následný výběr nejlepšího plánu odhad ceny vychází z následujících údajů selectivity procento ze všech řádků dotaz či jeho část vybírá cardinality počet řádků dotaz či jeho část zpracovává cost použití I/O, CPU a paměti dotazem či jeho části (diagram převzat z Database SQL Tuning Guide, Oracle Database Online Documentation 12cR1) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 8 / 24
Generování a výběr nejlepšího plánu vykonávání 1 výběr přístupové cesty k datům 2 výběr metody spojení tabulek 3 výběr pořadí spojení tabulek (diagram převzat z Database SQL Tuning Guide, Oracle Database Online Documentation 12cR1) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 9 / 24
Přístupová cesta v plánu vykonávání (Access Path) přímý přístup k tabulkám (Heap-Organized Tables) Full Table Scans procházení bez smysluplně použitelného indexu Table Access by Rowid dohledání po průchodu indexem Sample Table Scans výběr procentního vzorku z tabulky přístup k tabulkám přes B-strom (B-Tree Index Access) Index Unique Scans rovnost na sloupci s jedinečnými hodnotami Index Range Scans test rozsahu či rovnost v sloupci s dupl. hod. Index Full Scans výpis hodnot z indexovaných sloupců Index Fast Full Scans výpis hodnot pouze ze sloupců indexu Index Skip Scans dotazování pouze části složeného indexu Index Join Scans výpis hodnot pouze z sloupců indexů přístup k tabulkám přes bitmapový index (Bitmap Indexes) Bitmap Index Single Value rovnost na indexovaném sloupci Bitmap Index Range Scans test rozsahu na indexovaném sloupci Bitmap Merge použití několika bitmapových indexů přístup ke clusterům tabulek (Table Clusters) (Cluster Scans, Hash Scans) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 10 / 24
Metoda spojení v plánu vykonávání (Join Method) Nested Loops Joins prohledávání spojovaných tabulek ve vnořených cyklech (tj. každý rádek první tabulky se porovná se všemi řádky druhé tabulky, atd.) Hash Joins párování záznamů spojovaných tabulek přes hash klíče spojení (tj. spočítají se hash pro sloupec klíče spojení v každém řádku menší tabulky a pak se prochází větší tabulka a pro každý její řádek se spočítá opět hash klíče spojení, pomocí kterého se nalezne odpovídající řádek první tabulky, který má stejný hash) Sort Merge Joins párování seřazených záznamů spojovaných tabulek (tj. záznamy spojovaných tabulek jsou seřazeny dle sloupců klíče spojení a prochází se souběžně a párují se záznamy shodných hodnot klíče spojení) Cartesian Joins výpis všech záznamy spojovaných tabulek ve vnořených cyklech (bez klíče spojení; tj. každý rádek 1. tabulky se spojí se všemi řádky 2. tabulky) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 11 / 24
Použití EXPLAIN PLAN... EXPLAIN PLAN neprovede dotaz, pouze vyvolá optimalizátor (průběžné sledování výsledků optimalizace provedených dotazů se provádí jinak) vysvětlení dotazu není zobrazeno, ale je uloženo do sys. tabulky (implicitně se výsledky ukládají do tabuly plan_table ) vysvětlené dotazy lze získat tabulky s různou podrobností ( basic pro výsledky optimalizátotoru, typical vč. odhadu ceny, all pro vše) EXPLAIN PLAN FOR SET STATEMENT_ID myexplainedquery SELECT prod_category, avg(amount_sold) FROM sales s, products p WHERE p.prod_id = s.prod_id GROUP BY prod_category; SELECT plan_table_output FROM table(dbms_xplan.display( plan_table, myexplainedquery, typical )); -- output: -- ----------------------------------------------------------------- -- Id Operation Name Rows Cost (%CPU) Time -- ----------------------------------------------------------------- --.................. Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 12 / 24
Příklad použití EXPLAIN PLAN drop table mark; drop table student; create table student(stdid int primary key, year int); create table mark(stdid REFERENCES student(stdid), subj char(3), mark char(1), primary key (stdid,subj)); create index mark_mark on mark(mark); insert all into student values (1, 2) into student values (2, 3) into mark values (1, IDS, A ) into mark values (1, PDB, B ) into mark values (2, IDS, E ) into mark values (2, PDB, F ) select * from dual; explain plan for select * from student natural join mark; select plan_table_output from table(dbms_xplan.display()); /* ^ HASH JOIN, 2x TABLE ACCESS FULL */ explain plan for select stdid,subj from student natural join mark; select plan_table_output from table(dbms_xplan.display()); /* ^ NO JOIN, 1x INDEX FAST FULL SCAN */ explain plan for select * from student natural join mark where mark!= F ; select plan_table_output from table(dbms_xplan.display()); /* ^ NESTED LOOPS, INDEX UNIQUE SCAN & TABLE ACCESS FULL */ explain plan for select /*+ INDEX(mark mark_mark) */ * from student natural join mark where mark!= F ; select plan_table_output from table(dbms_xplan.display()); /* ^ NESTED LOOPS, INDEX UNIQUE SCAN & INDEX FULL SCAN */ Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 13 / 24
Optimalizátor lze ovlivnit pomocí HINTs optimalizátor může zvolit nejjednodušší plán, nikoliv nejsprávnější (např. při nízkém počtu záznamů prochází tabulky pomocí TABLE ACCESS FULL) optimalizaci dotazu je možno upřesnit pomocí HINTs (např. zvolit konkrétní index či metodu spojení; vizte odkaz na seznam HINTs) (diagram převzat z Database SQL Tuning Guide, Oracle Database Online Documentation 12cR1) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 14 / 24
Materializovaný pohled Materializovaný pohled Vytvoření materializovaného pohledu Použití materializovaného pohledu uchovává výsledek dotazu, který vychází z jiných pohledů a z tabulek (na rozdíl od běžného pohledu, který pouze provádí daný dotaz; tabulky v dotazu v mat. pohledu se nazývají master tabulky a jejich db. je master databáze) lze nastavit vlastnosti materializovaného pohledu: LOGGING db. zaznamenává operace s pohledem (v místním redo-logu; je-li potřeba, přehrává se, např. při chybě či zrcadlení) CACHE db. postupně optimalizuje čtení z pohledu (čtené bloky umíst ovány na začátek cache, kde jsou příště hned dostupné) REFRESH FAST db. aktualizuje pohled dle logů master tabulek (přehrávání redo-logu je rychlejší, než provádění celého dotazu pohledu) ON COMMIT db. aktualizuje pohled po commitu master tabulek (zaručuje automatickou aktualizaci dat v pohledu; opak je ON DEMAND) BUILD IMMEDIATE db. naplní pohled ihned po jeho vytvoření (v opačném případě se mat. pohled naplní až příštím REFRESH) ENABLE QUERY REWRITE bude používán optimalizátorem (mat. pohled bude použit pro optimalizaci přesně stejného dotazu) FOR UPDATE db. aktualizuje umožňuje změnu dat v pohledu (musí mít také nastaveno WITH PRIMARY KEY nebo WITH ROWID) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 16 / 24
Materializovaný pohled Vytvoření materializovaného pohledu Použití materializovaného pohledu Příklad definice materializovaného pohledu create table student(stdid int primary key, year int); create table mark(stdid REFERENCES student(stdid), subj char(3), mark char(1), primary key (stdid,subj)); -- create rowid master tables logs for fast refresh materialized view create materialized view log on student with rowid; create materialized view log on mark with rowid; -- create fast refresh materialized view from join of master tables create materialized view student_mark nologging cache build immediate refresh fast on commit enable query rewrite as select stdid, student.year, mark.subj, mark.mark, student.rowid as sudent_rowid, mark.rowid as mark_rowid from student natural join mark; Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 17 / 24
Materializovaný pohled Vytvoření materializovaného pohledu Použití materializovaného pohledu Příklad použití materializovaného pohledu explain plan for SELECT * FROM student NATURAL JOIN mark; select plan_table_output from table(dbms_xplan.display(null,null, basic )); -- -------------------------------------- -- Id Operation Name -- -------------------------------------- -- 0 SELECT STATEMENT -- 1 HASH JOIN -- 2 TABLE ACCESS FULL STUDENT -- 3 TABLE ACCESS FULL MARK -- -------------------------------------- alter session set query_rewrite_enabled = true; explain plan for SELECT stdid, student.year, mark.subj, mark.mark, student.rowid as sudent_rowid, mark.rowid as mark_rowid FROM student NATURAL JOIN mark; select plan_table_output from table(dbms_xplan.display(null,null, basic )); -- ----------------------------------------------------- -- Id Operation Name -- ----------------------------------------------------- -- 0 SELECT STATEMENT -- 1 MAT_VIEW REWRITE ACCESS FULL STUDENT_MARK -- ----------------------------------------------------- Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 18 / 24
a ACID ACID a ovládáná databázové transakce Zamykání databázových objektů Optimalizace práce s databází bez změny dotazů Atomicity Atomičnost transakcí, žádný rozpracovaný stav a to i ve vztahu k možné chybě OS či HW. (proběhne celá transakce, tj. všechny její změny, nebo nic) Consistency V DB jsou pouze platná data dle daných pravidel. Transakce se neuskuteční, pokud to nelze dodržet, jinak platí, že původní i nový stav je platný. Isolation Souběžné transakce se neovlivňují. Serializace. Pořadí však není zajištěno. Durability Uskutečněná transakce nebude ztracena (její projev). Podpora obnovy dat po pádu HW/SW. ACID netriviální, omezuje změny dat (zamykání) a přístup k datům (rychlost). Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 20 / 24
Ovládání databázové transakce ACID a ovládáná databázové transakce Zamykání databázových objektů Optimalizace práce s databází bez změny dotazů transakce může obsahovat jedno z následujících 1 jeden nebo více DML SQL dotazů 2 právě jeden DDL SQL příkaz transakce začíná prvním odeslaným SQL dotazem/příkazem transakci končí jedno z následujících 1 1 libovolný DDL SQL příkaz COMMIT 2 chybné ukončení session ROLLBACK 3 správné ukončení session COMMIT (COMMIT je v tomto případě výchozí chování, lze změnit) 4 zadání COMMIT nebo ROLLBACK bez TO SAVEPOINT SAVEPOINT vytvoří místo v transakci, od kterého lze před koncem transakce odvolat pomocí ROLLBACK TO SAVEPOINT (ROLLBACK TO SAVEPOINT se odvolá vše po daném místě v transakci vč. zámků od toho místa modifikovaných objektů, ale transakci neukončí) 1 pozor na autocommit, v sqlplus: SET AUTOCOMMIT OFF Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 21 / 24
Zamykání databázovou transakcí ACID a ovládáná databázové transakce Zamykání databázových objektů Optimalizace práce s databází bez změny dotazů transakce zamče upravené řádky či tabulky až do jejího konce úpravy zamčených objektů v jiné transakci jsou ihned blokovány (zámky objektů jsou výlučné, pokus zamčít již zamčené je ihned blokován) odblokování transakcí čekajících na zámek provede až ukončení transakce vlastnící zámek, nikoliv uvolnění zámku (tzn. uvolnění samotného zámku bez ukončení stransakce, např. pomocí ROLLBACK TO SAVEPOINT, nezpůsobí odblokování zablokovaných) blokované transakce čekající na již uvolněné zámky mohou předběhnout jiné dosud neblokované transakce -- tran1 -- tran2 update student set year=3; savepoint before_mark_lock; update mark set mark= F ; rollback to savepoint before_mark_lock; commit; -- ^ tran1 ends update mark set mark= E ; -- ^ blocked by tran1 -- ^ blocked by tran3 -- ^ not-blocked commit; -- tran3 update mark set mark= F ; -- ^ not-blocked commit; -- ^ tran3 ends Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 22 / 24
ACID a ovládáná databázové transakce Zamykání databázových objektů Optimalizace práce s databází bez změny dotazů Optimalizace práce s databází bez změny dotazů zamykání a odemykání objektů a (od)blokování je časově náročné (zámek využijte maximálně, např. mnoho úprav jedné tabulky dělejte společně v jedné transakci, tj. na začátku vypněte autocommit a nakonci potvrd te commitem) zpracování dotazu optimalizátorem, tj. volba plánu vykonávání dotazu, před jeho samotným provedením je časově náročné (pro opakované volání dotazů předpřipravte dotaz/použjte výzané promněnné, takže se optimalizátor vyvolá pouze jednou; v JDBC pomocí PreparedStatement) sít ová komunikace s databázovým serverem je časově náročná (posílejte dotazy, které nemají odpověd, po větších skupinách; v JDBC používejte (Prepared)Statement.addBatch() a.executebatch()) (obrázky převzaty z David Krch: Rychlejší aplikace i bez změn dotazů) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 23 / 24
Shrnutí a závěr Shrnutí a závěr Často prováděné složité dotazy je nutno odladit. (zobrazit vykonávací plán, zavést indexy a mat. pohledy, případně použít hints) Materializovaný pohled obsahuje výsledky dotazu. (nastavením mat. pohledu se určí, jak se výsledky získají a použijí) Modifikace dat v transakcích vede k zamykání. (a zamykání může způsobit blokování, nutno odladit) Je nutno optimalizovat také přístup k db. serveru, nejen dotazy. (jeden commit, předpřipravené dotazy s vázanými proměnnými, odesílání dávek) Marek Rychlý Optimalizace dotazů a databázové transakce v Oracle Demo-cvičení pro IDS, 22. dubna 2015 24 / 24