Indexy & select
Jan Serak
sherry na pikebo.cz
Pátek Září 22 09:42:34 CEST 2000
Vladimir Naprstek wrote:
>
> Zdravim,
> mam takovy problem: Mam data roztahana do peti tabulek, pricemz hlavni
> tabulka je pomoci klicu spojena se dvemi tabulkami (jedna tabulka druhe
> urovne ma definovan foreign key do hlavni tabulky, druha je jen pres
> indexy). Spojeni typicky 1:N. Kazda tabulka druhe urovne je spojena s
> jednou tabulkou treti urovne. Tyto vazby jsou 1:1 a pouzit foreign key.
> Vytvoril jsem si pohled, sdruzujici data z techto tabulek a v nem chci
> hledat. Pokud zadam podminku, ktera omezuje data z hlavni tabulky, bezi
> dotaz dostatecne rychle. Pokud vsak zadam podminku na data z podrizenych
> tabulek (hleda se podle klicu obsazenych v tabulkach druhe urovne),
> dotaz trva vice nez 50x pomaleji. Indexy mam na vsechny sloupce, v nichz
> muze probihat hledani.
1. Zkuste se podivat na exekucni plan. Ten ziskate tak, ze:
SQL> alter session set sql_trace true;
SQL> select ...;
SQL> exit
Timto postupem se vytvoril soubor v $ORACLE_BASE/admin/SID/udump/ora_PID.trc,
kde PID je cislo procesu "oracle", ktery bezel na pozadi spusteneho
SQL*Plus a SID je nazev instance. Adresar lze modifikovat v init.ora,
tohle je defaultni cesta.
Soubor ora_PID.trc pak zpracujete tkprofem:
$ tkprof $ORACLE_BASE/admin/SID/udump/ora_PID.trc vystup.prof sys=no
explain=un/pw
Ziskate tak lidsky citelny soubor vystup.prof, ktery bude obsahovat spoustu
uzitecnych informaci o tom, jak se optimizer s danym selectem vyrovnal.
Parametr explain=un/pw urcuje, ze se ma tkprof prihlasit do databaze pod
identifikaci un/pw a ze schematu un ma cerpat informace pro vysvetleni
exekucniho planu. Parametr sys=no rika, ze se tkprof nema zaobirat zalezitostmi
data dictionary atd.
2. Pokud mate dotaz na tri- a vicevrstevnou strukturu master-detail, je dobre
mit optimizer v rule-based modu a v klauzuli from setridit tabulky podle
velikosti
od nejmensi (tim byva vetsinou nejvyssi master). Tim se docili toho, ze Oracle
bude sekvencne prochazet nejmensi tabulku.
select ... from master m,detail d,subdetail s
where m.primary=d.foreign
and d.primary=s.foreign
and ...
Nejste-li si jist, v jakem modu bude nastaven optimizer, staci dotaz ohintovat.
Hint je specialni poznamka ve tvaru /*+ hint_1 hint_2 ... */
a v danem pripade pro zapnuti rule-based modu je treba hint /*+ CHOOSE */
3. Zakladni chyba, kterou jste udelal, ze pouzivate view prilis univerzalne.
Pokud chcete zjistit pro daneho zamestnance seznam knih, ktere ma vypujceny,
je nesmyslne k tomu zjistovat kategorie. A zase naopak, kdyz chcete seznam
knih dane kategorie, nezajimaji Vas vypujcky. Takze moje rada od boku strelena:
zruste ten view pres vsech 5 tabulek, nebo jej pouzivejte pouze pro dotazy,
kdy jste schopen omezit knihy. Jinak se totiz nemuze uplatnit zadny vhodny
index a proleza se sekvencne (ve vystupu z tkprofu zjistite, ze pristup
k teto tabulce byl realizovan metodou FULL SCAN), coz bude hlavni pricina
zpomaleni. V pripadech, kdy nejste schopen omezeni na hlavni tabulce zadat,
vyrobte specialni select, napr.
select ... from kniha k,vypujcka v
where k.primary=v.kniha
and v.zamestnanec in (...);
5. Pokud Vam nedostacuje dokumentace dodana s RDBMS, zkuste
http://technet.oracle.com -
je tam spousta dalsich dokumentaci, tips & tricks, white paperu,...
Pokud se nepletu, je registrace zdarma.
Jan Serak
Další informace o konferenci Databases