|
本帖最后由 wzslw 于 2012-9-13 15:04 编辑
索引是用来提高查询效率的,但是并不是索引越多越好,因为索引也是占用空间的,数据库在修改数据的时候为了维护数据完整性就要维护依赖修改数据的索引,索引越多需要的时间越长。发表一下感慨:东西好不好,看你怎么搞,好的能搞坏,坏的可搞好。。。(不要丢砖头)。合适的才是最好的,不要浪费不必要的消耗。
有时候我们凭借和经验创建了一些索引,觉得他们可能会用到。。。但是那只是感觉而已,到底用的到还是没用到我们要讲究个证据。如何取证呢?且听我慢慢忽。。额,慢慢说:
1.取证之监控索引
根据官方文档教给我的方法是这样监控索引的:alter index 索引名称 monitoring usage。这样就开启了索引监控功能,这时候dmbs就开始监控这个索引是否被使用过呢。要监控的有意义就必须有sql语句执行啊,你不执行sql ,dbms怎么知道你这个索引有没有被用过啊(废话)。开启索引监控是耗费系统资源滴,不能老开着它吧,alter index 索引名称 nomonitoring usage,这样就关闭了索引监控,什么?和开启一样?亲,仔细看看好不好,干嘛犯我犯过的错误。。。至于监控多长时间,根据你系统的负载来确定,最好把系统中每个可能用到的sql都执行一遍。还没完呢,虽然dbms知道了索引有没有被使用,但是你还是不知道。。。因为你还没看到监控结果。。。
2.取证之真相大白(大象真白)
通过这个语句 select * from v$object_usage;查询出来的就监控结果。
看官方介绍:
You can use this view to monitor index usage. The view displays statistics about index usage gathered from the database. All indexes that have been used at least once can be monitored and displayed in this view. [td]Column | Datatype | Description | INDEX_NAME | VARCHAR2(30) | Index name in sys.obj$.name | TABLE_NAME | VARCHAR2(30) | Table name in sys.obj$.name | MONITORING | VARCHAR2(3) | YES| NO | USED | VARCHAR2(3) | YES| NO | START_MONITORING | VARCHAR2(19) | Start monitoring time in sys.object_stats.start_monitoring | END_MONITORING | VARCHAR2(19) | End monitoring time in sys.object_stats.end_monitoring |
证据在此,该删除的删除吧,省的在这浪费感情,浪费资源。。。。
补充:写个实用的小脚本
--开启监控所有索引
begin
for cr in (select index_name from user_indexes) loop
execute immediate 'alter index '||cr.index_name||' monitoring usage';
end loop;
end;
--关闭所有索引监控,
begin
for cr in (select index_name from user_indexes) loop
execute immediate 'alter index '||cr.index_name||' nomonitoring usage';
end loop;
end;
因为技术有限难免会有错误,欢迎各位指出纠正。
|
|