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