В версии Oracle 9i появилась возможность текущего контроля использования конкретных индексов.
Для этого нужно пропустить команду:

ALTER INDEX name_index MONITORING USAGE;

и, через время посмотреть результат в представлении SYS.V$OBJECT_USAGE. Там выносится вердикт для индекса : USED = yes / no

Для всех индексов пакет команд можно сформировать таким запросом:
SELECT 'ALTER INDEX '||index_name||' MONITORING USAGE;' FROM USER_INDEXES;


Для более старых версий Oracle, узнать об использовании индекса, хоть и обходным путём, но узнать всё же можно.

Вариант 1

Для этого нужно выбрать тексты всех SQL из совместно используемого пула :

select address, sql_text

from v_$sqltext

order by address, piece;

Потом нужно прогнать все запросы через explain plan , сохранить результаты и выбрать из них нужную статистику. Например сведения о том какие таблицы и индексы вообще не упоминаются :)

Вариант 2

Можно переодически просматривать содержимое буферный кэш Oracle и выбирать там имеющиеся индексы используя неафишируемую табличку x$bh.

Для Oracle 7

SELECT DISTINCT d.segment_name, owner,d.SEGMENT_TYPE FROM x$bh x, DBA_EXTENTS d
WHERE x.dbafil=d.file_id AND d.block_id=x.DBABLK AND d.OWNER NOT IN ('SYS','SYSTEM')
AND d.OWNER='UTC'
AND d.SEGMENT_TYPE='INDEX'

И для Oracle 9 :

SELECT DISTINCT d.segment_name, owner,d.SEGMENT_TYPE, x.tch FROM x$bh x, DBA_EXTENTS d
WHERE x.FILE#=d.file_id AND d.block_id=x.DBABLK AND d.OWNER NOT IN ('SYS','SYSTEM')
AND d.OWNER='UTC'
AND segment_type='INDEX'

теоретически поле x.tch - это счётчик использования в буфере, или, скорее всего, счётчик изменений, хотя у меня он почему-то иногда не изменяетя...

Хостинг от uCoz