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

发表于:2016-10-10 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:解道    来源:51Testing软件测试网采编

  索引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
  这并不是说你的索引将永远不会被使用,而是他们最近还没有被使用过。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号