ORACLE索引监控的简单使用

--ORACLE索引监控的简单使用
-------------------------2013/11/20

说明:
    应用程序在开发时,可能会建立众多索引,但是这些索引的使用到底怎么样,是否有些索引一直都没有用到过,这需要我们对这些索引进行监控,以便确定他们的使用情况,并为是否可以清除它们给出依据。
    本文介绍两种方式:
    第一:开启监控功能;
    第二:查看历史的执行计划,进行分析;
 
环境:
    SQL> select * from v$version;
 
    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
    PL/SQL Release 10.2.0.3.0 - Production
    CORE    10.2.0.3.0      Production
    TNS for Linux: Version 10.2.0.3.0 - Production
    NLSRTL Version 10.2.0.3.0 - Production
    
测试:
    第一:
        CREATE TABLE tt
        AS
        SELECT * FROM dba_objects;
 
        DELETE FROM  tt
        WHERE object_id IS NULL;
 
        ALTER TABLE tt ADD CONSTRAINT pk_tt PRIMARY KEY(object_id);
 
        注:使用alter index <INDEX_NAME> nomonitoring usage取消监控。
 
        SELECT object_id, object_name
        FROM tt
        WHERE object_id = 333;
 
        SELECT INDEX_NAME, MONITORING, USED, START_MONITORING, END_MONITORING
          FROM V$OBJECT_USAGE;
 
        为了避免V$OBJECT_USAGE只能查询到当前用户下索引的监控情况,可以使用如下语句查询数据库中所有监控索引的使用情况:
 
        SELECT U.NAME OWNER,
               IO.NAME INDEX_NAME,
               T.NAME TABLE_NAME,
               DECODE(BITAND(I.FLAGS, 65536), 0, 'NO', 'YES') MONITORING,
               DECODE(BITAND(OU.FLAGS, 1), 0, 'NO', 'YES') USED,
               OU.START_MONITORING START_MONITORING,
               OU.END_MONITORING END_MONITORING
          FROM SYS.USER$        U,
               SYS.OBJ$         IO,
               SYS.OBJ$         T,
               SYS.IND$         I,
               SYS.OBJECT_USAGE OU
         WHERE I.OBJ# = OU.OBJ#
           AND IO.OBJ# = OU.OBJ#
           AND T.OBJ# = I.BO#
           AND U.USER# = IO.OWNER#
 
    第二:
        1 利用library cache数据
            SELECT OBJECT_NAME
              FROM V$SQL_PLAN A, V$SQLAREA B
             WHERE A.SQL_ID = B.SQL_ID
               AND A.OBJECT_TYPE = 'INDEX'
               AND OBJECT_OWNER IN ('XXXX', 'XXXX');
 
        2 利用STATSPACK
            SELECT A.OBJECT_OWNER, A.OBJECT_NAME
              FROM STATS$SQL_PLAN A, STATS$SQL_PLAN_USAGE B
             WHERE A.PLAN_HASH_VALUE = B.PLAN_HASH_VALUE
               AND A.OBJECT_TYPE = 'INDEX';
                
        注:需要开启Statspack的快照功能,否则查不到数据;
 
        3 如果是10g以上版本的数据,可以使用AWR
            SELECT B.OBJECT_NAME
              FROM DBA_HIST_SNAPSHOT A, DBA_HIST_SQL_PLAN B, DBA_HIST_SQLSTAT C
             WHERE A.SNAP_ID = C.SNAP_ID
               AND B.SQL_ID = C.SQL_ID
               AND B.OBJECT_TYPE = 'INDEX'
               AND B.OBJECT_OWNER IN ('XXX', 'XXXX');
 
        注:可以通过如下语句查询AWR的运行情况
 
            SELECT *
            FROM DBA_HIST_WR_CONTROL; 
参考:
    http://www.hellodba.com/Doc/monitor_index.htm
     http://www.oracle.com/technology/global/cn/pub/articles/10gdba/week6_10gdba.html
 
    有待进一步学习的内容:
    http://www.remote-dba.net/oracle_10g_tuning/t_oracle_index_usage_tracking.htm
 
补充:
    关于索引监控的或者说跟踪,本文仅仅是停留在简单的理论阶段,到实践和深入还有很多内容要了解。
posted @   胡.杰  阅读(500)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示