概述

我们在维护业务系统时,可能会建立很多索引,那么这些索引的使用到底怎么样,是否有些索引一直都没有用到过,那么oracle 是如何监控索引的使用状况,是否可以清除它们?


监控索引

一般有两种方式:

1、直接监控索引的使用情况

(1)设置所要监控的索引:ALTER INDEX IDX_T_XX MONITORING USAGE;

(2)查看该索引有没有被使用:SELECT * FROM V$OBJECT_USAGE;

(3)关闭监控:ALTER INDEX IDX_T_XX NOMONITORING USAGE;

2、schema级别索引监控

如果我们想在系统中监控所有的索引,可以通过下面脚本实现监控数据库所有的索引。注意我们要排除一些系统表的索引、以及LOB indexes。原因有下面两个:

1:LOB indexes不能修改,否则会报ORA-22864错误(ORA-22864: cannot ALTER or DROP LOB indexes)。

2:ORA-00701: object necessary for warmstarting database cannot be altered

今天主要也是讲schema级别这块的索引监控,下面介绍下三个脚本。


开启索引监控脚本

直接执行脚本来开启索引监控,当然监控索引时长非常重要,太短的话有可能导致查询出来的数据有问题,一般建议监控一周后即可,OLAP系统则需要适当延长监控的时间。

SELECT 'ALTER INDEX ' || owner || '.' || index_name || ' MONITORING USAGE;' enable_monitor, 'ALTER INDEX ' || owner || '.' || index_name || ' NOMONITORING USAGE;' disable_monitor FROM dba_indexes WHERE INDEX_TYPE != 'LOB' and owner IN (SELECT username FROM dba_users WHERE account_status = 'OPEN') AND owner NOT IN ('SYS', 'SYSTEM', 'PERFSTAT', 'MGMT_VIEW', 'MONITOR', 'SYSMAN', 'DBSNMP') AND owner not like '%SYS%';

监控一个月就大概可以知道那些是无用的索引了。


监控索引使用情况脚本

虽然v$object_usage表能记录索引监控和使用的状态,但它不能统计索引被使用的次数和频率,只记录了在开启索引监控的时间段索引是否被使用过,这一点要值的注意。

另外需要注意的2点:

① 10g在收集统计信息时会导致索引被监控、这并非SQL语句产生、而在11g则不会出现这种情况了

② 外键索引不会因为主表的DML操作而被监控到、不要因为该索引没用而将它给删了。

查询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#;

历史执行计划分析索引使用情况脚本

其实也可以从视图DBA_HIST_SQL_PLAN中获取到数据库中所有索引的扫描次数情况,然后根据扫描次数和开发人员沟通是否需要保留索引。

WITH TMP1 AS(SELECT I.OWNER INDEX_OWNER,I.TABLE_OWNER,TABLE_NAME,INDEX_NAME,INDEX_TYPE,(SELECT NB.CREATEDFROM DBA_OBJECTS NBWHERE NB.OWNER = I.OWNERAND NB.OBJECT_NAME = I.INDEX_NAMEAND NB.SUBOBJECT_NAME IS NULLAND NB.OBJECT_TYPE = 'INDEX') CREATED,(SUM(S.BYTES) / 1024 / 1024) INDEX_MB,(SELECT COUNT(1)FROM DBA_IND_COLUMNS DICWHERE DIC.INDEX_NAME = I.INDEX_NAMEAND DIC.TABLE_NAME = I.TABLE_NAMEAND DIC.INDEX_OWNER = I.OWNER) COUNT_INDEX_COLSFROM DBA_SEGMENTS S, DBA_INDEXES IWHERE I.INDEX_NAME = S.SEGMENT_NAMEAND I.OWNER = S.OWNERAND S.OWNER NOT LIKE '%SYS%'GROUP BY I.OWNER, I.TABLE_OWNER, TABLE_NAME, INDEX_NAME, INDEX_TYPEHAVING SUM(S.BYTES) > 1024 * 1024),TMP2 AS(SELECT INDEX_OWNER,INDEX_NAME,PLAN_OPERATION,(SELECT MIN(TO_CHAR(NB.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD HH24:MI:SS'))FROM DBA_HIST_SNAPSHOT NBWHERE NB.SNAP_ID = V.MIN_SNAP_ID) MIN_DATE,(SELECT MAX(TO_CHAR(NB.END_INTERVAL_TIME, 'YYYY-MM-DD HH24:MI:SS'))FROM DBA_HIST_SNAPSHOT NBWHERE NB.SNAP_ID = V.MAX_SNAP_ID) MAX_DATE,COUNTSFROM (SELECT D.OBJECT_OWNER INDEX_OWNER,D.OBJECT_NAME INDEX_NAME,D.OPERATION || ' ' || D.OPTIONS PLAN_OPERATION,MIN(H.SNAP_ID) MIN_SNAP_ID,MAX(H.SNAP_ID) MAX_SNAP_ID,COUNT(1) COUNTSFROM DBA_HIST_SQL_PLAN D, DBA_HIST_SQLSTAT HWHERE D.OPERATION LIKE '%INDEX%'AND D.SQL_ID = H.SQL_IDGROUP BY D.OBJECT_OWNER, D.OBJECT_NAME, D.OPERATION, D.OPTIONS) V)SELECT A.TABLE_OWNER,A.TABLE_NAME,A.INDEX_OWNER,A.INDEX_NAME,A.CREATED,A.INDEX_TYPE,A.INDEX_MB,A.COUNT_INDEX_COLS,B.PLAN_OPERATION,CASEWHEN MIN_DATE IS NULL THEN(SELECT MIN(TO_CHAR(NB.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD HH24:MI:SS'))FROM DBA_HIST_SNAPSHOT NB)ELSEMIN_DATEEND AS MIN_DATE,CASEWHEN MAX_DATE IS NULL THEN(SELECT MAX(TO_CHAR(NB.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD HH24:MI:SS'))FROM DBA_HIST_SNAPSHOT NB)ELSEMAX_DATEEND AS MAX_DATE,COUNTSFROM TMP1 ALEFT OUTER JOIN TMP2 BON (A.INDEX_OWNER = B.INDEX_OWNER AND A.INDEX_NAME = B.INDEX_NAME);

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

oracle 索引_分享三个Oracle数据库索引监控脚本,值得收藏相关推荐

  1. 字符集_超详细的MySQL数据库字符集总结,值得收藏

    概述 MySQL支持多种字符集(character set)提供用户存储数据,同时允许用不同排序规则(collation)做比较.下面基于MySQL5.7介绍一下字符集相关变量的使用. 一.字符集.字 ...

  2. mysql数据库字符集_超详细的MySQL数据库字符集总结,值得收藏

    MySQL支持多种字符集(character set)提供用户存储数据,同时允许用不同排序规则(collation)做比较.下面基于MySQL5.7介绍一下字符集相关变量的使用. 一.字符集.字符序的 ...

  3. mysql创建非聚集索引_一文看懂聚集索引和非聚集索引的区别

    一.深入浅出理解索引结构 实际上,可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclu ...

  4. 电脑技巧:分享六个有趣好玩的网站,值得收藏

    目录 1.Weavesilk 2.一键抠图 3.狗屁不通文章生成器 4.小霸王在线小游戏 5.世界名画在线拼图 6.寻找不动的emoji 今天小编给大家分享六个有趣好玩的网站,值得收藏! 1.Weav ...

  5. oracle强制走索引_实验验证:Oracle聚簇因子对索引使用的影响

    [引言] 本文基于如下文章进行的实验,讲述聚簇因子对SQL索引的影响. 链接如下: https://www.modb.pro/db/40283 一张表上有索引,sql在执行的时候却不走索引的原因有很多 ...

  6. oracle 运营维护_总结几个ORACLE数据库日常运维常用的命令(持续更新)

    1.重建DBLINK不知道用户密码,不用知道密码,密文在SYS.LINK$存着呢,以sysdba的权限才能取出来 然后通过SQL创建DBLINK CREATE DATABASE LINK " ...

  7. mysql和oracle转换_转MySql 与Oracle区别

    http://blog.sina.com.cn/s/blog_61e034d50100k6xn.html 近期突击学习了mysql,应杨毅的邀请,简单比较一下mysql和oracle的差别,不当之处欢 ...

  8. mysql查询一个表有哪些索引_如何查看某张数据库表上都有哪些索引(转)

    索引使用简介 一. 关于索引的知识 要写出运行效率高的sql,需要对索引的机制有一定了解,下面对索引的基本知识做一介绍. 1. 索引的优点和局限 索引可以提高查询的效率,但会降低dml操作的效率. 所 ...

  9. Oracle SQL篇(三)Oracle ROWNUM 与TOP N分析

        首先我们来看一下ROWNUM: 含义解释: 1.rownum是oracle为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推.这是一个伪列,可以用于限制查询返回的总行数. 2 ...

最新文章

  1. Know about RDBMS market share
  2. NeurIPS 2019截稿期服务器被挤爆,投稿数增长40%创历史新高
  3. 图解设计模式-Abstract Factory模式
  4. 使用timer定时器,防止事件重入
  5. Linux学习笔记-文件压缩与解压缩
  6. android 开关数据连接电脑,Android网络数据开关用法简单示例
  7. 关于MySQL优化的几个问题
  8. html5 drawimage参数,HTML canvas
  9. c语言学习-对从键盘输入的一个字符串中的大英字母及数字进行计数
  10. Unity AssetBundle 踩坑记录
  11. 什么是视频封装格式和编码格式
  12. php7国内,介绍php7和php5对比
  13. 《Detecting Adversarial Examples through Image Transformation》和CW attack的阅读笔记
  14. 东数西算,浪潮云在枢纽节点提供服务
  15. 品优购项目笔记(十四):微信支付
  16. 复利/单利计算程序进度
  17. 51单片机c语言编程的头文件,51单片机编程的头文件reg51.h详解
  18. 一年前寫的:計算所得稅以及計算24點遊戲
  19. 大龄程序员的出路在哪里!40岁50岁你还有精力每天抱着电脑写程序吗?
  20. c#申请126邮箱 有时提交不了

热门文章

  1. 【Flink】Flink界面如何查看数据是否倾斜
  2. SpringBoot : Spring容器生命周期管理:SmartLifecycle
  3. git : 上传大文件或者PDF或者二进制文件导致无法上传
  4. Redis问的太深入,面试官说:“你先回去等通知吧“!
  5. Flask实现图片的上传、下载及展示
  6. Java进阶资源汇总
  7. Oracle存储过程介绍
  8. 原生js实现文字无缝向上滚动效果
  9. [k8s]dashboard1.8.1搭建( heapster1.5+influxdb+grafana)
  10. python学习--交互式图形编程实例四