如何发现数据库不再使用的索引Index吗?

索引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

这并不是说你的索引将永远不会被使用,而是他们最近还没有被使用过。


Does Your Database Really Use Your Index? – Java,