Ungenutzte Indices bedeuten unnötigen Verwaltungsaufwand und Platzverbrauch, deshalb ist es sinnvoll, sie zu löschen. Voraussetzung ist allerdings herauszufinden, welche Indices genutzt werden und welche nicht. Ab Version 9.0 ist dies relativ einfach möglich mit der Erweiterung des ALTER INDEX-Befehls:
und der neuen DD-View
In V$OBJECT_USAGE werden Indices eingetragen, deren Nutzung überwacht wird oder wurde; in der Spalte MONITORING wird angezeigt, ob der Index zur Zeit überwacht wird, und die Spalte USED gibt an, ob der Index seit dem (letzten) Einschalten der Überwachung genutzt wurde.
Mit der Option MONITORING USAGE wird die Überwachung der Nutzung eingeschaltet, mit NOMONITORING USAGE ausgeschaltet.
Beispiel:
Die im folgenden benutzte Ausgangstabelle BIGEMP ist eine Vervielfältigung der Daten aus SCOTT.EMP. Die Ausgabe der Spalten index_name und table_name wurde auf je 12 Zeichen formatiert.
ALTER TABLE bigemp ADD(nr NUMBER);
UPDATE bigemp SET nr = ROWNUM;
COMMIT;
ALTER TABLE bigemp
ADD CONSTRAINT pk_bigemp PRIMARY KEY(nr);
CREATE INDEX idx_empno ON bigemp(empno);
SQL> SELECT * FROM V$OBJECT_USAGE;
Es wurden keine Zeilen ausgewählt
ALTER INDEX pk_bigemp MONITORING USAGE;
ALTER INDEX idx_empno MONITORING USAGE;
SQL> SELECT * FROM V$OBJECT_USAGE;
INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING
------------ ------------ --- --- ------------------- -------------------
IDX_EMPNO BIGEMP YES NO 10/13/2003 12:10:00
PK_BIGEMP BIGEMP YES NO 10/13/2003 12:08:11
SELECT * FROM bigemp WHERE nr = 7; (Ausgabe weggelassen)
SQL> SELECT * FROM V$OBJECT_USAGE;
INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING
------------ ------------ --- --- ------------------- -------------------
IDX_EMPNO BIGEMP YES NO 10/13/2003 12:10:00
PK_BIGEMP BIGEMP YES YES 10/13/2003 12:08:11
ALTER INDEX IDX_EMPNO NOMONITORING USAGE;
ALTER INDEX PK_BIGEMP NOMONITORING USAGE;
SQL> SELECT * FROM V$OBJECT_USAGE;
INDEX_NAME TABLE_NAME MON USE START_MONITORING END_MONITORING
------------ ------------ --- --- ------------------- -------------------
IDX_EMPNO BIGEMP NO NO 10/13/2003 12:10:00 10/13/2003 12:13:00
PK_BIGEMP BIGEMP NO YES 10/13/2003 12:08:11 10/13/2003 12:13:21
Soll beispielsweise eine Applikation auf ungenutzte Indices hin überprüft werden, so bietet sich an, mit Hilfe eines Skripts für alle Indices die Überwachung einzuschalten, dann in einem repräsentativen Zeitraum und Umfang die Applikation zu nutzen und dann das Monitoring über ein weiteres Skript wieder auszuschalten. Die entsprechenden Skripten werden am einfachsten über Spool-Dateien erzeugt.
Beispiel:
SET FEEDBACK OFF HEADING OFF ECHO OFF
SET PAGESIZE 0
SPOOL monitoring_ein.sql
SELECT 'ALTER INDEX ' ||owner||'.'||index_name||' MONITORING USAGE;'
FROM ALL_INDEXES WHERE owner = 'SCOTT';
SPOOL OFF
@monitoring_ein.sql
Arbeiten in der Datenbank...
SPOOL monitoring_aus.sql
SELECT 'ALTER INDEX ' ||owner||'.'||index_name||' NOMONITORING USAGE;'
FROM ALL_INDEXES WHERE owner = 'SCOTT';
SPOOL OFF
@monitoring_aus
SELECT index_name FROM v$object_usage WHERE used = 'NO';
INDEX_NAME
------------
IDX_EMPNO
Bitte nehmen Sie mich in den Verteiler der monatlichen Tipps & Tricks auf.