Was bedeutet dies nun für den Oracle Text Index?
Zieht man das Handbuch Oracle Text Application Developer's Guide 11g Release 2 (11.2) zu rate, findet man im Abschnitt "Tuning Oracle Text" auf die Frage, ob man Statistiken sammeln sollte oder nicht, folgende nicht eindeutige Antwort dazu:
"Yes. Collecting statistics on your tables enables Oracle Text to do cost-based analysis. This helps Oracle Text choose the most efficient execution plan for your queries. If your queries are always pure text queries (no structured predicate and no joins), you should delete statistics on your Oracle Text index."
Noch einmal zur Erinnerung, wenn wir einen Text Index (z. B. TEXT_IDX) erzeugen, werden automatisch mindestens folgende Objekte erzeugt:
- DR$TEXT_IDX$I: Token Tabelle
- DR$TEXT_IDX$X: Index
- DR$TEXT_IDX$K: DOCID (nach ROWID) Mapping Tabelle
- DR$TEXT_IDX$N: Tabelle für Negativliste für alle gelöschten DOCIDs
- DR$TEXT_IDX$R: ROWID (nach DOCID) Mapping Tabelle
- Sollten Statistiken auf den einzelnen DR$ Objekten existieren?
Die Antwort darauf lautet nein! Alle internen rekursiven Abfragen haben Hints (wie zum Beispiel /*+DYNAMIC_SAMPLING(0) INDEX(T "DR$TEST_IDX$X")*/) um einen festgelegten Ausführungsplan zu verwenden. Dieser Plan hat sich als bester Plan erwiesen. Statistiken auf den Objekten könnten zu einem veränderten und somit schlechteren Plan führen. - Werden Statistiken im Maintenance Job für Oracle Text mitgepflegt?
Auch hier lautet die Antwort nein. DBMS_STATS.GATHER_SCHEMA_STATS oder DBMS_STATS.GATHER_DATABASE_STATS analysiert keine internen Texttabellen und Indizes.
Um zu verifizieren, ob Ihre Umgebung die Regel 1) erfüllt, führen Sie einfach folgenden Test durch:
SQL> select table_name,last_analyzed from user_tables where table_name like '%TEST_IDX%'; TABLE_NAME LAST_ANAL ------------------------------ --------- DR$TEST_IDX$I DR$TEST_IDX$R DR$TEST_IDX$K DR$TEST_IDX$NFür die Indizes ergibt sich folgende Abfrage:
SQL> select index_name, user_stats, global_stats, last_analyzed from user_indexes where table_name like '%TEST_IDX%'; INDEX_NAME USE GLO LAST_ANAL ------------------------------ --- --- --------- SYS_IOT_TOP_223146 NO NO DR$TEST_IDX$X NO NO SYS_IL0000223143C00002$$ NO NO SYS_IOT_TOP_223141 NO NO SYS_IL0000223138C00006$$ NO NOHaben die Einträge in der Spalte LAST_ANALYZED den Wert "null", müssen Sie nichts unternehmen. Finden Sie Statistiken auf einem dieser Objekte, löschen Sie diese wie folgendes Beispiel zeigt.
SQL> select index_name, user_stats, global_stats, last_analyzed from user_indexes where table_name like '%TEST_IDX%'; INDEX_NAME USE GLO LAST_ANAL ------------------------------ --- --- --------- SYS_IOT_TOP_223146 NO NO DR$TEST_IDX$X NO NO 20-FEB-12 SYS_IL0000223143C00002$$ NO NO SYS_IOT_TOP_223141 NO NO SYS_IL0000223138C00006$$ NO NO SQL> execute dbms_stats.delete_index_stats('US','DR$TEST_IDX$X'); --- zur Kontrolle SQL> select index_name, user_stats, global_stats, last_analyzed from user_indexes where table_name like '%TEST_IDX%'; INDEX_NAME USE GLO LAST_ANAL ------------------------------ --- --- --------- SYS_IOT_TOP_223146 NO NO DR$TEST_IDX$X NO NO SYS_IL0000223143C00002$$ NO NO SYS_IOT_TOP_223141 NO NO SYS_IL0000223138C00006$$ NO NOWeitere Informationen zu dem Thema finden Sie auch in der öffentlichen My Oracle Support Note DOC ID 139979.1.