当前位置:  数据库>oracle

应用alter index ××× monitoring usage;语句监控索引使用与否

    来源: 互联网  发布时间:2017-06-14

    本文导语: 随着时间的累积,在没有很好的规划的情况下,数据库中也许会存在大量长期不被使用的索引,如果快速的定位这些索引以便清理便摆在案头。我们可以使用"alter index ××× monitoring usage;"命令将索引至于监控状态下,经过一定的...

随着时间的累积,在没有很好的规划的情况下,数据库中也许会存在大量长期不被使用的索引,如果快速的定位这些索引以便清理便摆在案头。我们可以使用"alter index ××× monitoring usage;"命令将索引至于监控状态下,经过一定的监控周期,那些不被使用到的索引便会在具体Schema下的v$object_usage视图中得以体现。展示一下这个过程,供参考。

友情提示:生产数据库中的索引添加和删除一定要慎重,需要做好充分的测试。

1.环境准备

--1、创建表T
SQL> create table t (x int);

Table created.

--2、初始化一条数据
SQL> insert into t values (1);

1 row created.

SQL> select * from t;

        X
----------
        1

--3、在表T的X字段上创建索引
SQL> create index i_t on t(x);

Index created.

 

 2.将索引I_T置于监控状态下

SQL> alter index I_T monitoring usage;

Index altered.

3.查看v$object_usage视图中记录的信息

 

SQL> col INDEX_NAME for a10
SQL> col TABLE_NAME a10
SQL> col START_MONITORING for a20
SQL> col END_MONITORING for a20
SQL> select * from v$object_usage;

INDEX_NAME TABLE_NAME MONITORING  USED      START_MONITORING    END_MONITORING
---------- ---------- ---------- --------- -------------------- -----------------
I_T        T          YES        NO        07/17/2010 22:27:13

 

 

此时MONITORING字段内容为“YES”,表示I_T已经处于被监控状态。USED字段内容为“NO”表示该索引还未被使用过。

4.模拟索引被使用

 

SQL> set autot on
SQL> select * from t where x = 1;

        X
----------
        1


Execution Plan
----------------------------------------------------------
Plan hash value: 2616361825

-------------------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time    |
-------------------------------------------------------------------------
|  0 | SELECT STATEMENT |      |    1 |    13 |    1  (0)| 00:00:01 |
|*  1 |  INDEX RANGE SCAN| I_T  |    1 |    13 |    1  (0)| 00:00:01 |
-------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

  1 - access("X"=1)

Note
-----
  - dynamic sampling used for this statement


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads
          0  redo size
        508  bytes sent via SQL*Net to client
        492  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

 

从执行计划上可以看出,该查询使用到了索引I_T

5.再次查看v$object_usage视图中记录的信息

 

SQL> set autot off
SQL> select * from v$object_usage;

INDEX_NAME TABLE_NAME MONITORIN USED      START_MONITORING    END_MONITORING
---------- ---------- --------- --------- -------------------- -----------------
I_T        T          YES      YES      07/17/2010 22:27:13

 

此时USED字段内容变为“YES”,表示I_T索引在监控的这段时间内被使用过。
如果在一个较科学的监控周期下USED字段一直处于“NO”的状态,则可以考虑将此类索引删掉。

6.停止对索引的监控,观察v$object_usage状态变化

 

SQL> alter index I_T nomonitoring usage;

Index altered.

sec@ora10g> select * from v$object_usage;

INDEX_NAME TABLE_NAME MONITORIN USED      START_MONITORING    END_MONITORING
---------- ---------- --------- --------- -------------------- -------------------
I_T        T          NO        YES      07/17/2010 22:27:13  07/17/2010 22:32:27

 

此时MONITORIN字段内容为“NO”,表示已经停止对索引I_T的监控。

7.再次启用索引监控,观察v$object_usage状态变化

 

SQL> alter index I_T monitoring usage;

Index altered.

sec@ora10g> select * from v$object_usage;

INDEX_NAME TABLE_NAME MONITORIN USED      START_MONITORING    END_MONITORING
---------- ---------- --------- --------- -------------------- ------------------
I_T        T          YES      NO        07/17/2010 22:36:40

 

MONITORIN字段内容为“YES”,表示索引I_T处于被监控中;USED字段为“NO”,表示再次启用监控后的这段时间内该索引没有被使用过。
停起对索引的监控的过程相当于索引监控重置的过程。

8.一次性生成当前用户下所有索引的监控语句

可以使用SQL生成SQL脚本的方法来完成。
以对SECOOLER用户下所有索引生成监控语句为例

 

SQL> select 'alter index '||owner||'.'||index_name||' monitoring usage;' as "Monitor Indices Script" from dba_indexes where owner in ('SECOOLER');

Monitor Indices Script
---------------------------------------------------------------
alter index SECOOLER.I_T monitoring usage;
…… 省略 ……

 

如果您对PL/SQL熟悉的话,可以更方便的完成批量将索引置为被监控状态。

 

SQL> conn secooler/secooler
SQL> begin
  2  for rec in (select index_name from user_indexes)
  3    LOOP
  4        dbms_output.put_line(rec.index_name);
  5        EXECUTE IMMEDIATE 'alter index '||rec.index_name||' monitoring usage';
  6    end loop;
  7  end;
  8  /

I_T
…… 省略其他索引名字 ……

PL/SQL procedure successfully completed.

9.小结

一般生产数据库很少使用这种方法(前提是做好规划),多见于测试数据库。测试数据库中出于对各种索引组合的测试需求,可能创建众多的索引,使用这种方法可以比较便捷的确认那些不被用到的索引。


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • MySQL查询优化之索引的应用详解
  • 索引在Oracle中的应用深入分析
  • Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
  • 重装服务器后IIS网站错误(应用程序中的服务器错误)
  • 让HTML5应用与原生应用一样运行流畅 Steroids.js
  • 隐藏andriod 应用app启动图标的几种方法
  • 如何将应用程序加到桌面或应用程序组?
  • ​传统应用的docker化迁移
  • 怎样开发在LINUX 上运行的应用程序,像WINDOWS桌面应用程序一样
  • Http协议3XX重定向介绍及301跳转和302跳转应用场景
  • adnroid已安装应用中检测某应用是否安装的代码实例
  • Docker 1.12.4应用容器引擎发布及下载地址
  • linux商业应用或者说开源软件商业应用是否需要付费?
  • Docker v1.13.0 应用容器引擎正式版发布及下载地址
  • 在多cpu的linux系统上,到底是用多线程应用好些还是多进程应用好些??
  • docker应用之利用Docker构建自动化运维
  • 我要监测一台远程电脑的状态(未上线/上线但没打开每个应用程序/上线且打开应用程序),该如何作?
  • Windows下Docker应用部署相关问题详解
  • Android应用内调用第三方应用的方法
  • Docker详细的应用与实践架构举例说明
  • asp.net应用程序的生命周期和iis应用程序池
  • 手动执行应用程序ok,但用crontab(在正确的用户名下)运行应用程序就报-12545(tns连接错误),怎么解决?
  • 一个静态库包含多个函数,应用程序连接了库中的某个函数,应用程序目标代码中是否还包含了该静态库中的其他函数代码?
  • 介绍下速度快而应用功能齐全的LINUX版本,忍受不了windows的低速了……应用即可,最好带X。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,