Dnes je: 21. května 2012
| Monitorování indexu |
|
Indexy se využívají pro rychlejší vyhledávání setříděných informací. Zjistíte-li například, že daný dotaz běží pomalu a navíc prohází celou tabulku tzv. full table scan, je nasnadě vytvořit nad sloupcem, který je v klauzuli where index. Vývojáři mají snahu dělat indexy nad všemi sloupci a to není dobře. Sice se vám zrychlí vyhledání, ale naopak se zpomalí vkládání. Dále je potřeba se o indexy starat, dělat rebuild indexu, to znamená aktualizovat informace a to stojí také nějaký výkon a čas. Z tohoto důvodu je dobré zkontrolovat, zda jsou jednotlivé indexy využívány a nebo jsou zbytečné. Jeden ze způsobů je zapnout monitoring problémového indexu. Vytvořte si testovací tabulku, naplňte ji daty a nad ní vytvořte index. Můžete využít již vytvořených tabulek ve schématu Scott. SQL> show user USER is "SCOTT" SQL> create table test as select * from all_objects; Table created. Vytvořili jste tabulku test, která je kopii tabulky all_objects. Teď nad ní vytvořte jednoduchý index. Strukturu tabulky si vypíšete příkazem desc test. Sloupec, nad kterým budete vytvářet index se jmenuje object_id a je číselného typu. SQL> create index testidx on test(object_id); Index created. Prostředí je připravené. Nyní musíte spustit monitorování indexu. K tomu slouží volba monitoring usage. Naopak pro vypnutí monitoringu slouží přepínač nomonitoring usage. SQL> alter index TESTIDX MONITORING usage; Index altered. Monitorování indexu je zapnuté, teď tedy zkuste udělat dotaz nad danou tabulkou, abyste použili index. Zda byl index použit zjistíte výpisem spouštěcího plánu. K tomu můžete použít parametr Set autotrace on explain v sqlplus, který zajistí výpis spouštěcího plánu. K tomu samému účelu vám slouží i skript utlxpls.sql. SQL> Set autotrace on explain SQL> select count(*) from test where object_id=5; COUNT(*) ---------- 0 Execution Plan ---------------------------------------------------------- Plan hash value: 121734241 ----------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 13 | 1 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 13 | | | |* 2 | INDEX RANGE SCAN| TESTIDX | 1 | 13 | 1 (0)| 00:00:01 | ----------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("OBJECT_ID"=5) Z výpisu je patrné, že byl využit index testidx. Poznámka: Při použití skriptu utlxpls.sql je potřeba definovat pro který dotaz se má spouštěcí plán připravit. Tento způsob se používá u složitých a dlouhých dotazu. Jakmile, je dotaz přeložen stačí jej jen vypsat pomocí zmíněného skriptu a získáte ten samý výstup jako při použití nastavení v sqlplus. SQL> EXPLAIN PLAN FOR select count(*) from test where object_id=5; Explained. SQL> @$ORACLE_HOME/rdbms/admin/utlxpls.sql ... Posledním krokem je tedy zjištění zda byl index použit. Stačí k tomu jednoduchý dotaz do tabulky v$object_usage. SQL> select * from v$object_usage; INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING ------------------------------ ------------------------------ --- TESTIDX TEST YES YES 10/28/2009 15:21:11 Jak vidíte, index je využíván. V případě, že v tabulce v$object_usage nenaleznete hledaný index, je to dobrý kandidát na smazání. Sloupec end_monitoring je prázdný, protože se index stále monitoruje. Jakmile by jste monitoring vypnuli, bude zde uveden čas. Metalink: 1033478.6 Script: To Monitor the Usage of Indexes 203645.1 How to Monitor Index Usage? 136642.1 Identifying Unused Indexes with the ALTER INDEX MONITORING USAGE Command
|
Partnerské internetové stránky:
www.oracledba.cz www.asktom.cz www.tomas-solar.cz