pondělí 24. listopadu 2008

Optimalizace dotazů s použitím HINTů

V tomto příspěvku bych se chtěl podělit o zkušenost s atributem Hint, který jsme byli nuceni použít z důvodu optimalizace dotazů.

Po implementaci dashboardu u jednoho nejmenovaného klienta doba trvání všech dotazů probíhala v požadovaných časech (1-3 sekundy). Cca 2 měsíce po nasazení do produkčního provozu došlo k náhlému poklesu výkonnosti dotazů až na několik desítek minut. Toto bylo způsobeno tím, že faktové tabulky se měsíčně „rozmnožovaly“ o cca 10 miliónů záznamů.

Optimalizaci jsme se rozhodli vyřešit nasazením atributů hint v metadatech přímo u fyzické tabulky. Po nasazení se výkon dotazů vrátil do původních požadovaných časových intervalů (u některých dotazů byla doba trvání dotazu dokonce nižší než po zahájení produkčního provozu).

Pro nastavení jednoho HINTu vše funguje jak má:

Např. syntaxe pro použití konkrétního indexu je: INDEX(název_tabulky, název_indexu) Hint se uvádí u tabulek ve Fyzické vrstvě metadata repository:



My jsme ale museli řešit požadavek, kdy u daného dotazu se mohly zadat různé filtry (podmínky) na více hlavních atributů – vždy alespoň na jeden z nich. Na každý daný hlavní atribut byl v databázi použit index na který jsme chtěli nastavit hint. Syntaxe použití více hintů najednou je (opět pro index) tato (oddělovačem je mezera):

INDEX(název_tabulky, název_indexu) INDEX(název_tabulky, název_indexu) INDEX(název_tabulky, název_indexu)
Bohužel použitá verze OBI EE (10.1.3.3.0) neumí tento zápis rozklíčovat.

Řešení je jednoduché („vypocené“): pro 2. a další hint se nesmí použít název fyzické tabulky, ale její alias, pod kterým je uvedena ve výsledném fyzickém SQL.

Naštěstí je tento alias neměnný (zřejmě se generuje z identifikátoru, pod kterým je tabulka uložená v metadatech).

Příklad:

INDEX(F_ATM, IDX_ATM_CARD) INDEX(T1391, IDX_ATM_TERM) INDEX(T1391, IDX_ATM_POSTDAT_AUDIT)



Miroslav Petr (konzultant společnosti Adastra).

Žádné komentáře: