Databázové Aplikace Slidy ke cvičení DBI026, část 2 KSI MFF UK Verze 05.11.03.12.20.

Slides:



Advertisements
Podobné prezentace
Základy jazyka SQL Jan Tichava
Advertisements

Zpracování SQL Lubomír Andrle 5. přednáška
A5M33IZS – Informační a znalostní systémy Dotazovací jazyk SQL - I.
SQL: DDL v ORACLE CREATE TABLE jméno_tabulky (atribut datový_typ [DEFAULT][attribut_constraint] [, atribut datový_typ [DEFAULT] [attribut_constraint]],...
Aplikační a programové vybavení
Jazyk SQL Ing. Zdena DOBEŠOVÁ. SQL Structured Query Language 1974 SEQUEL (Structured English Query Language) neprocedurální relační dotazovací jazyk norma.
LOV, Listbox, Poplist a Combobox v Oracle Forms LOV – seznam hodnot, které se zobrazí po stisku klávesy Enter v textovém poli. LOV – seznam hodnot, které.
DB1 – 9. cvičení Optimalizace dotazu Konkurenční přístup a deadlock Indexace Transakce.
Fakulta elektrotechniky a informatiky
Informační systémy Nástroje pro sběr dat, návrh a realizace databáze.
Informatika pro ekonomy II přednáška 11
Databázové systémy II Přednáška č. 6 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Architektury a techniky DS Tvorba efektivních příkazů I Přednáška č. 3 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy 1 Cvičení č. 2 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Fakulta elektrotechniky a informatiky
Databázové systémy 1 Cvičení č. 3 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Václav Martínek. Evidence předení koček Vytvoření nové databáze - Po přihlášení se k databázovému serveru (Database Engine) si ze všeho nejdříve vytvoříme.
SQL Přednáška DB1. Literatura CONNOLLY, T.M.-BEGG,C.E.-STRACHAN,A.D.: Database Systems – A Practial Approach to Design, Implementation and Management.
MySQL - Vytvoření nové tabulky  create table jméno_tabulky (jméno_položky typ_položky,... ) Přehled nejběžnějších datových typů Přehled nejběžnějších.
Execution plans Lubomír Andrle 6. přednáška
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Databázové systémy II Přednáška č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Fakulta elektrotechniky a informatiky
Optimalizace SQL dotazů
Databázové systémy teorie a návrh relačních databázových systémů část II.
Relační databáze.
Vypracoval: Ondřej Dvorský Třída: VIII.A
KIV/ZIS cvičení 6 Tomáš Potužák. Pokračování SQL Klauzule GROUP BY a dotazy nad více tabulkami Stáhnout soubor studenti_dotazy_sql.mdb.
Databázové systémy I Cvičení č. 6 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
SQL – základní pojmy Ing. Roman Danel, Ph.D.
SQL PVA Jan Hora. SQL „graficky“ Grafický vs. pravý SQL SELECT ORDED BY WHERE.
Rauer Luboš Kopic Petr Blažek Tomáš. Structured Query Language - dotazovací jazyk -> pracuje s dotazy - neprocedurální jazyk - mocný, ale přitom jednoduchý.
Databázové systémy II Přednáška č. X Ing. Tomáš Váňa, Ing. Jiří Zechmeister Fakulta elektrotechniky a informatiky
Číslo šablony: III/2 VY_32_INOVACE_P4_3.8 Tematická oblast: Aplikační software pro práci s informacemi II. Databáze – základy SQL Typ: DUM - kombinovaný.
Architektury a techniky DS Tvorba efektivních příkazů II
Optimalizace SQL dotazů Michal Kopecký
Databázové systémy 2 Zkouška – 8:00. Příklad I – Procedura – 5 bodů Vytvořte proceduru P_ZK2(p_table_name VARCHAR2, p_min_nuls NUMBER, p_drop.
Aplikační a programové vybavení
Obchodní akademie, Ostrava-Poruba, příspěvková organizace Vzdělávací materiál/DUM VY_32_INOVACE_01B13 Autor Ing. Jiří Kalousek Období vytvoření březen.
Architektury a techniky DS Cvičení č. 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Databázové systémy 2 Cvičení č. 5 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Základní obeznámení s jazykem SQL Databázové systémy.
Databázové systémy SQL Výběr dat.
TEMPORÁLNÍ DATABÁZE A TSQL2
Progress SQL92 Optimalizátor Jan Lánský
Databázové Aplikace Slidy ke cvičení DBI026, část 3 KSI MFF UK Verze
Administrace Oracle Paralelní zpracování.
Petr Čermák Michal Danihelka
Příkazy jazyka SQL ve VFP a na SQL Serveru
Databázové Aplikace Slidy k přednášce DBI026 KSI MFF UK
Databázové systémy I Cvičení č. 5 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Databázové systémy a SQL
Databázové systémy přednáška 6 – Indexy
SQL – příkaz SELECT Ing. Roman Danel, Ph.D.
Ing. Tomáš Váňa, Ing. Jiří Zechmeister
Dotazovací jazyk SQL I.
Architektury a technika databázových systémů
Databázové systémy a SQL
Databázové systémy a SQL
Šablona 32 VY_32_INOVACE_038.ICT.34
Optimalizace SQL dotazů
Databázové systémy a SQL
Počítačová cvičení z předmětu Datové sklady #1 Relační model dat
Přednáška 7 SQL – JOIN.
Přednáška 9 Triggery.
Databázové jazyky Jaroslav Pokorný FI BVŠP Bratislava
Databázové systémy a SQL
Transkript prezentace:

Databázové Aplikace Slidy ke cvičení DBI026, část 2 KSI MFF UK Verze

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Vytvoření demo tabulek EMP a DEPT Pokud existovaly, jsou sktiptem nejprve smazány příkazy –DROP TABLE DEPT; –DROP TABLE EMP;

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Vytvoření tabulky PLAN_TABLE pro ukládání plánů provedení Zapnutí AUTOTRACE v SQL*Plus –SET AUTOTRACE ON Případné vypnutí AUTOTRACE –SET AUTOTRACE OFF

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle SQL> select * from dept; DEPTNO DNAME LOC ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON Execution Plan SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (FULL) OF 'DEPT‚ Statistics recursive calls 0 db block gets 23 consistent gets 0 physical reads 0 redo size 505 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 4 rows processed Průchod tabulkou DEPT bez použití indexů

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Spojení obou tabulek EMP a DEPT SQL> SELECT Emp.*, Dept.Loc 2 FROM Dept, Emp 3 WHERE Dept.DeptNo=Emp.DeptNo; Execution Plan SELECT STATEMENT Optimizer=CHOOSE 1 0 MERGE JOIN 2 1 SORT (JOIN) 3 2 TABLE ACCESS (FULL) OF 'EMP‚ 4 1 SORT (JOIN) 5 4 TABLE ACCESS (FULL) OF 'DEPT' Statistics recursive calls 0 db block gets 33 consistent gets 0 physical reads 0 redo size 1239 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 4 sorts (memory) 0 sorts (disk) 14 rows processed Setřídění obou tabulek a následný MERGE (velmi neefektivní spojení)

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Jaké na tabulkách existují omezení? –SELECT Constraint_name, Constraint_type, Table_name, Search_condition FROM User_constraints WHERE Table_name IN ('DEPT','EMP'); Jen nepojmenovaná kontrola NOT NULL sloupce EMP.EmpNo –CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION SYS_C C EMP "EMPNO" IS NOT NULL

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Přidáme primární klíče a cizí klíč –ALTER TABLE EMP ADD CONSTRAINT EMP_PK PRIMARY KEY (EmpNo); –ALTER TABLE DEPT ADD CONSTRAINT DEPT_PK PRIMARY KEY (DeptNo); –ALTER TABLE EMP ADD CONSTRAINT EMP_FK_DEPT FOREIGN KEY (DeptNo) REFERENCES DEPT(EmpNo) ON DELETE SET NULL; Existující omezení: –CONSTRAINT_NAME C TABLE_NAME SEARCH_CONDITION EMP_PK P EMP DEPT_PK P DEPT EMP_FK_DEPT R DEPT SYS_C C EMP "EMPNO" IS NOT NULL

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Spojení obou tabulek EMP a DEPT SQL> SELECT Emp.*, Dept.Loc 2 FROM Dept, Emp 3 WHERE Dept.DeptNo=Emp.DeptNo; Execution Plan SELECT STATEMENT Optimizer=CHOOSE 1 0 NESTED LOOPS 2 1 TABLE ACCESS (FULL) OF 'EMP‚ 3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' 4 3 INDEX (UNIQUE SCAN) OF 'DEPT_PK' (UNIQUE) Statistics recursive calls 0 db block gets 81 consistent gets 0 physical reads 0 redo size 1346 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 8 sorts (memory) 0 sorts (disk) 14 rows processed Vnořené cykly, pro každého zaměstnance se dohledá oddělení přes index

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Kteří zaměstnanci jsou v New Yorku? SQL> SELECT * FROM Emp 2 WHERE DeptNo=( SELECT DeptNo FROM Dept WHERE Loc='NEW YORK' ); Execution Plan SELECT STATEMENT Optimizer=CHOOSE 1 0 FILTER 2 1 TABLE ACCESS (FULL) OF 'EMP‚ 3 1 TABLE ACCESS (FULL) OF 'DEPT‚ Statistics recursive calls 0 db block gets 52 consistent gets 0 physical reads 0 redo size 764 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 4 sorts (memory) 0 sorts (disk) 3 rows processed Spojit vše se vším (?) a výsledné řádky filtrovat

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Kteří zaměstnanci jsou v New Yorku? Pokus s IN místo = … SQL> SELECT * FROM Emp 2 WHERE DeptNo IN ( SELECT DeptNo FROM Dept WHERE Loc='NEW YORK' ); Execution Plan SELECT STATEMENT Optimizer=CHOOSE 1 0 NESTED LOOPS 2 1 TABLE ACCESS (FULL) OF 'EMP‘ 3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' 4 3 INDEX (UNIQUE SCAN) OF 'DEPT_PK' (UNIQUE) Statistics recursive calls 0 db block gets 25 consistent gets 0 physical reads 0 redo size 764 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 3 rows processed Stejně jako join, odpovídající řádky se dohledají ve výsledku

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Vytvoříme ještě index přes cizí klíč … –CREATE INDEX Emp_DeptNo_Inx ON Emp(DeptNo); … a bitmapový index přes umístění oddělení –CREATE BITMAP INDEX Dept_Loc_Inx ON Dept(Loc);

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Kteří zaměstnanci jsou v New Yorku? SQL> SELECT * FROM Emp 2 WHERE DeptNo=( SELECT DeptNo FROM Dept WHERE Loc='NEW YORK' ); Execution Plan SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' 2 1 INDEX (RANGE SCAN) OF 'EMP_DEPTNO_INX' (NON-UNIQUE) 3 2 TABLE ACCESS (FULL) OF 'DEPT' Statistics recursive calls 0 db block gets 11 consistent gets 0 physical reads 0 redo size 770 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 3 rows processed V Dept se najde odpovídající řádka a k ní se přes index dohledají zaměstnanci

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Kteří zaměstnanci jsou v New Yorku? Pokus s IN místo = … SQL> SELECT * FROM Emp 2 WHERE DeptNo IN ( SELECT DeptNo FROM Dept WHERE Loc='NEW YORK' ); Execution Plan SELECT STATEMENT Optimizer=CHOOSE 1 0 NESTED LOOPS 2 1 TABLE ACCESS (FULL) OF 'EMP‘ 3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' 4 3 INDEX (UNIQUE SCAN) OF 'DEPT_PK' (UNIQUE) Statistics recursive calls 0 db block gets 25 consistent gets 0 physical reads 0 redo size 764 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 3 rows processed Stále stejně jako join, odpovídající řádky se dohledají ve výsledku

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Opět spojení obou tabulek … SQL> SELECT Emp.*, Dept.Loc 2 FROM Dept, Emp 3 WHERE Dept.DeptNo=Emp.DeptNo; Execution Plan SELECT STATEMENT Optimizer=CHOOSE 1 0 NESTED LOOPS 2 1 TABLE ACCESS (FULL) OF 'EMP‚ 3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' 4 3 INDEX (UNIQUE SCAN) OF 'DEPT_PK' (UNIQUE) Statistics recursive calls 0 db block gets 24 consistent gets 0 physical reads 0 redo size 1352 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 14 rows processed Vnořené cykly, pro každého zaměstnance se dohledá oddělení. Druhá tabulka ve FROM je řídící.

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Opět spojení obou tabulek … prohodíme pořadí tabulek ve FROM SQL> SELECT Emp.*, Dept.Loc 2 FROM Emp, Dept 3 WHERE Dept.DeptNo=Emp.DeptNo; Execution Plan SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' 2 1 NESTED LOOPS 3 2 TABLE ACCESS (FULL) OF 'DEPT‚ 4 2 INDEX (RANGE SCAN) OF 'EMP_DEPTNO_INX' (NON-UNIQUE) Statistics recursive calls 0 db block gets 13 consistent gets 0 physical reads 0 redo size 1280 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 14 rows processed Vnořené cykly, pro každé oddělení se dohledají zaměstnanci. Druhá tabulka ve FROM je opět řídící. Pokud by index přes cizí klíč neexistoval, byl by výsledek shodný s opačným pořadím.

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Zkusíme COST-BASED optimalizaci … Vytvoříme statistiky na tabulkách, optimalizátor v režimu CHOOSE bude CB optimalizaci upřednostňovat –ANALYZE TABLE Emp COMPUTE STATISTICS; –ANALYZE TABLE Dept COMPUTE STATISTICS;

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Opět spojení obou tabulek, tentokrát s CB optimalizací … SQL> SELECT Emp.*, Dept.Loc 2 FROM Emp, Dept 3 WHERE Dept.DeptNo=Emp.DeptNo; Execution Plan SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=574) 1 0 HASH JOIN (Cost=5 Card=14 Bytes=574) 2 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=448) 3 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=36) Statistics recursive calls 0 db block gets 15 consistent gets 0 physical reads 0 redo size 1279 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 14 rows processed Dat je tak málo, že se přístup přes indexy vůbec nevyplatí …

DBI026 -DB Aplikace - MFF UK Přidáme hint FIRST_ROWS a … Optimalizace v Oracle A opět spojení obou tabulek, minimalizujeme cenu nalezení první řádky … SQL> SELECT --+ FIRST_ROWS 2 Emp.*, Dept.Loc 3 FROM Emp, Dept 4 WHERE Dept.DeptNo=Emp.DeptNo; Execution Plan SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=8 Card=14 Bytes=574) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (Cost=1 Card=4 Bytes=128) 2 1 NESTED LOOPS (Cost=8 Card=14 Bytes=574) 3 2 VIEW OF 'index$_join$_002' (Cost=4 Card=4 Bytes=36) 4 3 HASH JOIN 5 4 BITMAP CONVERSION (TO ROWIDS) 6 5 BITMAP INDEX (FULL SCAN) OF 'DEPT_LOC_INX' 7 4 INDEX (FAST FULL SCAN) OF 'DEPT_PK' (UNIQUE) (Cost=1 Card=4 Bytes=36) 8 2 INDEX (RANGE SCAN) OF 'EMP_DEPTNO_INX' (NON-UNIQUE) Statistics recursive calls 0 db block gets 10 consistent gets 0 physical reads 0 redo size 1280 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 14 rows processed

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle A opět spojení obou tabulek, minimalizujeme cenu nalezení prvních 5 řádek … SQL> SELECT --+ FIRST_ROWS(5) 2 Emp.*, Dept.Loc 3 FROM Emp, Dept 4 WHERE Dept.DeptNo=Emp.DeptNo; Execution Plan SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=4 Card=5 Bytes=205) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (Cost=1 Card=4 Bytes=128) 2 1 NESTED LOOPS (Cost=4 Card=5 Bytes=205) 3 2 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=2 Bytes=18) 4 2 INDEX (RANGE SCAN) OF 'EMP_DEPTNO_INX' (NON-UNIQUE) Statistics recursive calls 0 db block gets 13 consistent gets 0 physical reads 0 redo size 1280 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 14 rows processed Přidáme hint FIRST_ROWS(5) a získáme zase jiný plán

DBI026 -DB Aplikace - MFF UK Stejné, jako bez nápovědy Optimalizace v Oracle A opět spojení obou tabulek, minimalizujeme cenu nalezení prvních 5 řádek bez použití indexu EMP_DEPTNO_INX SQL> SELECT 2 /*+ FIRST_ROWS(5) NO_INDEX(Emp Emp_Deptno_Inx)*/ 3 Emp.*, Dept.Loc 4 FROM Emp, Dept 5 WHERE Dept.DeptNo=Emp.DeptNo; Execution Plan SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=574) 1 0 HASH JOIN (Cost=5 Card=14 Bytes=574) 2 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=448) 3 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4 Bytes=36) Statistics recursive calls 0 db block gets 15 consistent gets 0 physical reads 0 redo size 1352 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 14 rows processed

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Jak se spočtou řádky? SQL> SELECT COUNT(*) 2 FROM Dept; Execution Plan SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1) 1 0 SORT (AGGREGATE) 2 1 INDEX (FULL SCAN) OF 'DEPT_PK' (UNIQUE) (Cost=1 Card=4) Statistics recursive calls 0 db block gets 1 consistent gets 0 physical reads 0 redo size 303 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed Spočtou se záznamy v indexu přes primární klíč

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Jak se spočtou řádky? Index Dept_PK zakážeme. SQL> SELECT 2 /*+ NO_INDEX(Dept Dept_PK)*/ 3 COUNT(*) 4 FROM Dept; Execution Plan SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1) 1 0 SORT (AGGREGATE) 2 1 BITMAP CONVERSION (COUNT) 3 2 BITMAP INDEX (FAST FULL SCAN) OF 'DEPT_LOC_INX' Statistics recursive calls 0 db block gets 3 consistent gets 0 physical reads 0 redo size 303 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed Spočtou se bity v bitmapovém indexu. Pro více řádek by tato metoda měla přednost, protože je objem indexu menší

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Jak se spočtou řádky? Indexy zcela zakážeme. SQL> SELECT 2 /*+ NO_INDEX (Dept)*/ 3 COUNT(*) 4 FROM Dept; Execution Plan SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=4) Statistics recursive calls 0 db block gets 7 consistent gets 0 physical reads 0 redo size 303 bytes sent via SQL*Net to client 495 bytes received via SQL*Net from … 4 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 1 rows processed Spočtou se řádky tabulky. Počet přístupů k datům (consistent gets) postupně rostl 1, 3, 7

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Příkaz EXPLAIN PLAN. SQL> EXPLAIN PLAN 2 SET STATEMENT_ID='pokus' 3 FOR 4 SELECT --+ RULE 5 Emp.*, Dept.Loc 6 FROM Dept, Emp 7 WHERE Dept.DeptNo=Emp.DeptNo; Kroky plánu se uloží do tabulky PLAN_TABLE.

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Výběr dat z PLAN_TABLE bez struktury. SQL> SELECT Statement_ID, ID, Parent_ID, Optimizer, Operation 2 FROM Plan_Table 3 where Statement_ID='pokus'; STATEMENT_ID ID PARENT_ID OPTIMIZER OPERATION pokus 0 HINT: RULE SELECT STATEMENT pokus 1 0 NESTED LOOPS pokus 2 1 TABLE ACCESS pokus 3 1 ANALYZED TABLE ACCESS pokus 4 3 ANALYZED INDEX

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Výběr dat z PLAN_TABLE se strukturou. SQL> SELECT Lpad(' ',2*Level-2)||Operation||' '||Options ||' '||Object_Name Text 2 FROM Plan_Table 3 CONNECT BY PRIOR Statement_ID = Statement_ID 4 AND PRIOR ID = Parent_ID 5 START WITH Statement_ID='pokus' 6 AND ID = 0; TEXT SELECT STATEMENT NESTED LOOPS TABLE ACCESS FULL EMP TABLE ACCESS BY INDEX ROWID DEPT INDEX UNIQUE SCAN DEPT_PK

DBI026 -DB Aplikace - MFF UK Optimalizace v Oracle Zrušíme statistiky na tabulkách, optimalizátor v režimu CHOOSE bude používat Rule-Based optimalizaci –ANALYZE TABLE Emp COMPUTE STATISTICS; –ANALYZE TABLE Dept COMPUTE STATISTICS;

DBI026 -DB Aplikace - MFF UK Clustery Speciální organizace tabulek –Více tabulek často spojovaných přes společný sloupec, nebo více sloupců, je možné uložit do tzv. clusteru. CREATE CLUSTER EmpDept(X NUMBER(3)); CREATE INDEX EmpDeptInx ON CLUSTER EmpDept; CREATE TABLE EMP(…) CLUSTER EmpDept(DeptNo); CREATE TABLE DEPT(…) CLUSTER EmpDept(DeptNo); Hodnoty sloupců clusteru jsou ukládány unikátně (úspora místa) Ostatní data řádek tabulek jsou ukládány blízko odpovídajících hodnot (úspora času při spojování)  Větší režie při aktualizacích EmpDept EmpDept