索引Index对于查询很重要,过了一段时间,当你的系统增长了,你可能会发现自己有大量的索引,这都会减慢到数据库的写操作,因为每个写入表中的操作,需要同时更新索引。
  或者,5年后,您的数据库(和查询)已经演进了,过去索引不再需要。例如,下面两个索引是明显有一个是多余的:
  -- 原来设计
  CREATE INDEX ON customer (first_name);
  -- 5年后
  CREATE INDEX ON customer (first_name, last_name);
  如果索引不再需要,删除它们。
  如何发现没有用的索引?
  如果使用是Oracle,可以访问产品系统,下面是通过获得使用索引的游标 缓存 中是否有任何查询的方法:
SELECT sql_fulltext
FROM v$sql
WHERE sql_id IN (
SELECT sql_id
FROM v$sql_plan
WHERE (object_owner, object_name)
= (('OWNER', 'IDX_CUSTOMER_FIRST_NAME'))
)
ORDER BY sql_text;
  这个查询是做什么的?它查询游标高速 缓存 中的所有SQL语句(V$SQL)并且变量它们中每一条,在游标 缓存 中检查是否有任何有访问索引的执行计划元素(V $ sql_plan)。
  一段时间内运行了这个任务后,如果这个查询不返回任何行,你可以得出这样的结论:你的索引可能不再需要了。
  以上是发现不再使用的索引,下面是发现不再需要的索引方法:
  运行简单查询,列出所有不再被v$sql_plan表引用的索引。
SELECT owner, index_name
FROM all_indexes
WHERE owner = 'OWNER'
AND (owner, index_name) NOT IN (
SELECT object_owner, object_name
FROM v$sql_plan
WHERE object_owner IS NOT NULL
AND object_name IS NOT NULL
)
ORDER BY 1, 2
  这并不是说你的索引将永远不会被使用,而是他们近还没有被使用过。