Es kommt vor, dass ein erstellter Index von ORACLE überhaupt nicht genutzt und/oder benötigt wird. Derartige Indizes erfüllen dann also keinen Zweck, benutzen aber Speicherplatz.
ORACLE bietet die Möglichkeit, Indizes über einen beliebigen Zeitraum hinweg zu beobachten, ob sie genutzt werden.
Ein Beispiel:
Erstellen wir zunächst eine Tabelle (den Sinn dieser Tabelle betrachten wir nicht an dieser Stelle):
CREATE TABLE INDEX_MONITOR
(
COL_1 VARCHAR2(10),
COL_2 VARCHAR2(10),
COL_3 VARCHAR2(10),
COL_4 VARCHAR2(10)
);
Als nächstes befüllen wir die Tabelle mit Zufallswerten:
begin
for i in 1 .. 100 loop
INSERT INTO INDEX_MONITOR VALUES (
dbms_random.string(‘COL_1′, 10),
dbms_random.string(‘COL_2′, 10),
dbms_random.string(‘COL_3′, 10),
dbms_random.string(‘COL_4′, 10));
end loop;
end;
/
Nun erstellen wir für jede Spalte einen Index (wie gesagt, an der Sinnhaftigkeit darf gezweifelt werden, es soll ja nur ein Beispiel sein…):
CREATE INDEX IDX_COL_1 ON INDEX_MONITOR (COL_1);
CREATE INDEX IDX_COL_2 ON INDEX_MONITOR (COL_2);
CREATE INDEX IDX_COL_3 ON INDEX_MONITOR (COL_3);
CREATE INDEX IDX_COL_4 ON INDEX_MONITOR (COL_4);
Das Monitoring der Indizes wird folgendermaßen gestartet:
ALTER INDEX IDX_COL_1 MONITORING USAGE;
ALTER INDEX IDX_COL_2 MONITORING USAGE;
ALTER INDEX IDX_COL_3 MONITORING USAGE;
ALTER INDEX IDX_COL_4 MONITORING USAGE;
Mit Hilfe der V$-View v$object_usage kann ORACLE abgefragt werden, ob Indizes genutzt werden oder nicht:
SELECT index_name, used FROM v$object_usage;
Momentan sieht das Ergebnis der Abfrage noch so aus:
INDEX_NAME USE ------------------------------ --- IDX_COL_1 NO IDX_COL_2 NO IDX_COL_3 NO IDX_COL_4 NO
Im nächsten Schritt werden drei Abfragen ausgeführt, von denen jede einen einzelnen Index nutzen wird:
SELECT COUNT(*) FROM INDEX_MONITOR WHERE COL_1=’1234567890′;
SELECT COUNT(*) FROM INDEX_MONITOR WHERE COL_3=’1234567890′;
SELECT COUNT(*) FROM INDEX_MONITOR WHERE COL_4=’1234567890′;
Wird die V$-View v$object_usage nun erneut abgefragt…:
SELECT index_name, used FROM v$object_usage;
… liefert sie das Ergebnis zurück, dass IDX_COL_2 nicht genutzt wurde:
INDEX_NAME USE ------------------------------ --- IDX_COL_1 YES IDX_COL_2 NO IDX_COL_3 YES IDX_COL_4 YES
Das Monitoring der Indizes wird mit den folgenden Befehlen ausgeschaltet:
ALTER INDEX IDX_COL_1 NOMONITORING USAGE;
ALTER INDEX IDX_COL_2 NOMONITORING USAGE;
ALTER INDEX IDX_COL_3 NOMONITORING USAGE;
ALTER INDEX IDX_COL_4 NOMONITORING USAGE;
Zugegeben, der Zeitraum, in dem das Monitoring eingeschaltet ist, wird in der Regel wesentlich länger sein, typischerweise ein Tag – vielleicht auch eine Woche. Es handelt sich hier auch nur um ein Beispiel.





[...] Beitrag “Index-Check” möchte ich um ein SQL-Script ergänzen. Das Monitoring der Objekte kann man zwar [...]