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