为了加快你的查询,增加正确的索引是必不可少的。 但是过了一段时间,当你的系统增长了,你可能会发现自己大量的索引导致数据库的写操作变慢 -- 由于每一次对表的写操作,都需要在事务中更新索引。
我们拥有十载网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供成都网站设计、做网站、微信开发、微信小程序定制开发、手机网站制作、H5开发、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。
也许,五年后, 你的数据库(和你的查询)在某种方式中进化,不再需要一些索引了。例如,有一些明显的情况下,这两个索引是多余的:
- -- 原设计
- 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
同样,这并不是说你的索引将永远不会被使用,只是它们最近还没有被使用过。现在,我不会真的给你展示使用上述语句的查询,在PL/SQL循环中运行其结果和使用EXECUTE IMMEDIATE删除所有的索引,因为你可能在你的生产环境中尝试。但是,以防万一你想尝试,这里有一个提示BEGIN
- BEGIN
- FOR i IN (/* above query here */) LOOP
- EXECUTE IMMEDIATE
- 'DR0P INDEX "' || i.owner || '"."' || i.index_name || '"';
- END LOOP;
- END;
- /
但正如我说的。不要真的这样做!
当前名称:你的数据库索引是否真的起作用了?
网站地址:http://www.mswzjz.cn/qtweb/news39/409339.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能