Kihagyás

Tervek

Tervmagyarázó eszköz

  • EXPLAIN PLAN FOR <query / dll>
    • Elmenti a tervet a plan_table-be
      • sorforrások + műveletek
    • plan_table nézete, vagy külső eszköz teszi olvashatóvá

??? title="Jesus christ, ez a muki tényleg manuál nézetbe leírt egy tervet"

CREATE TABLE PLAN_TABLE(
    statement_id varchar(30),
    options varchar(30),
    object_name varchar(30),
    parent_id numeric,
    cost numeric,
    operation varchar(30),
    object_owner varchar(30),
    id numeric,
    position numeric,
    bytes numeric,
);

~~~sql
CREATE OR REPLACE VIEW PLANS(STATEMENT_ID, PLAN, POSITION) AS
SELECT statement_id, rpad('>', 2*level, '.') || 
    operation ||
    decode(options, NULL, '', '(') || 
    nvl(options, ' ') || 
    decode(options, NULL, '', ')') || 
    decode(object_owner, NULL, '', object_owner || '.') ||
    object_name plan,
    position
FROM PLAN_TABLE
START WITH id=0
CONNECT BY PRIOR id=parent_id
    AND PRIOR nvl(statement_id, 'NULL') = nvl(statement_id, 'NULL')
~~~

output példa:

~~~txt
>Filter
>.....NL
>..........TA-full
>..........TA-rowid
>...............index Uscan
>.....TA-full
~~~

RBO heurisztikák

Elérhető indexek rangsorolása:

  1. Egyenlőség egy mezős egyedi indexen
  2. Egyenlőség láncolt egyedi indexen
  3. Egyenlőség láncolt indexen
  4. Egyenlőség egy mezős indexen
  5. Korlátos intervallum keresés indexben (like,between, leading-part,...)
  6. Nem korlátos intervallum keresés indexen (<, >=)

Azon felül hasraütés

CBO költségszámítás

Statisztikák különböző szinteken

  • Tábla
    • num_rows, blocks, empty_blocks, avg_space
  • Mező
    • num_values, low_value, high_value, num_nulls
  • Index
    • distinct-keys, Blevel, avg_leaf_blocks_per_key, avg_data_blocks_per_key, leaf_blocks

Az egyes indexek kiválasztóképességének számításához használjuk

  • Kiválasztóképesség = sorok hány %-át adja vissza
  • FTS-t is figyelembe vesszük itt

CBO - csomósodási tényező

Index szintű statisztika

  • Mennyire jól rendezettek a sorok az indexelt értékhez képest?
  • Átlagos blokkszám, hogy elérjünk egyetlen értéket
    • 1 asszondja, hogy az intervallumkeresés olcsó
    • <táblasorok száma> azt jelenti, hogy drága az intervallumkeresés
  • Több elérhető intervallumkeresés rangsorolására

Nyomkövető fájlok

  • Tervmagyarázat - betekintés végrehajtás előtt
  • Nyomkövetés - betekintés végrehajtás közben
    • Felhasznált CPU idő
    • Eltelt idő
    • Fizikai blokk I/O száma
    • Gyorsítótárazott blokk I/O száma
    • Sorforrásonként feldolgozott sorok száma
  • A munkamenetet nyomkövető módra kell állítani
    • ALTER SESSION SET sql_trace=true;
    • EXEC dbms_system.set_sql_state_in_session(sid, s#, T/F);
  • A nyomkövető fájl az adatbázisszerveren generálódik
    • TKPROF eszközzel kell formázni
      • TKPROF <nyomkövető fájl> <tkp fájl> <user>/<pw>
    • SQL utasításonként 2 szakasz
call    count    cpu  elapsed disk query current rows
------- ----- ------ -------- ---- ----- ------- ----
Parse       1   0.06     0.07    0     0       0    0
Execute     1   0.01     0.01    0     0       0    0
Fetch       1   0.11     0.13    0    37       2    2
------- ----- ------ -------- ---- ----- ------- ----
total       3   0.18     0.21    0    37       2    2

Tippek

  • Kényszerítik az optimalizálót, hogy egy konkrét opció mellett döntsön
  • Beágyazott megjegyzéssel valósítjuk meg
SELECT /*+<tipp>*/ ...
FROM ...
WHERE ...;

UPDATE /*+<tipp>*/ ...
WHERE ...;

DELETE /*+<tipp>*/ ...
WHERE ...;

INSERT (Id.SELECT)

Gyakori tippek

  • full (<tab>)
  • index (<tab><ind>)
  • index_asc(<tab><ind>)
  • index_desc(<tab><ind>)
  • ordered
  • use_nl(<tab><tab>)
  • use_merge(<tab><tab>)
  • use_hash(<tab><tab>)
  • leading(<tab>)
  • first_rows, all_rows, rule

Analyze

  • Statisztikát időnként generálni kell
ANALYZE <TABLE | INDEX> <x> 
<COMPUTE | ESTIMATE | DELETE> STATISTICS
<SAMPLE <x> <ROWS | PERCENT>>

pl ANALYZE TABLE emp SETIMATE STATISTICS SAMPLE 30 PERCENT;

Adattárház jellemzők

  • Hagyományos * lekérdezés
  • Bittérkép indexek
    • Bittérkép egyesítése, átalakítása rowid-ra
    • Egyetlen táblás lekérdezés
  • * lekérdezés
    • Több táblás

The Tuning way

  • Képes beolvasni tervet
  • Képes átírni egy tervet 3GL programmá
    • Ismerjük a sorforrás műveleteinket
  • Képes beolvasni SQL-t
  • Képes átalakítani az SQL-t üzleti lekérdezéssé
    • Ismerjük az adatmodellünket
  • Képes megítélni a kimenetelt
    • Ismerjük az üzleti szabályokat / adatstatisztikákat
      • Jobban, mint CBO
  • Szakértők
    • Optimalizáljuk az SQL-t már annak szerkesztésekor