Oracle删除索引规范
1.背景概述
近期应用升级上线过程中,存在删除业务表索引的变更操作,且因删除索引导致次日业务高峰时期,数据库响应缓慢的情况,经定位是缺失索引导致。与用户沟通,虽然变更中删除索引的需求很少,但也存在此类需求。
本文从数据库层面,旨在尽可能避免类似问题发生,制定删除索引的变更规范。
2.索引删除规范
若确认需要做索引删除,可以使用Oracle提供的两个功能特性协助判断删除索引是否会有隐患。
2.1 增加索引监控
将计划要删除的索引经过至少一个业务周期(具体业务确认业务周期为多久,注意要考虑到跑批场景)的监控,如果整个业务周期,该索引一直没有被使用过则可以考虑删除。
演示案例:
create table T as select * from dba_objects;
create index IDX_T_01 on T(object_id);
假设要删除的索引名称是IDX_T_01,使用下面语句开启该索引的监控。
alter index jingyu.IDX_T_01 monitoring usage;
索引是否使用到,会在具体业务schema下的v$object_usage视图中体现(具体观察USED这一列的值,如果是NO,说明自监控以来该索引从未使用过)
conn jingyu/jingyu
col index_name for a30
col table_name for a30
col START_MONITORING for a30
col END_MONITORING for a30
set lines 180
select * from v$object_usage;
INDEX_NAME TABLE_NAME MONITO USED START_MONITORING END_MONITORING
---------- ---------- ------ ------ ------------------------------ ------------------------------
IDX_T_01 T YES NO 07/22/2020 14:15:18
如果有人/应用执行过用到该索引的语句,比如:
select object_id from t where object_id = 3;
此时再观察USED这一列的值,已经变为yes,说明自监控以来该索引有被使用过,就不能被轻易删除:
INDEX_NAME TABLE_NAME MONITO USED START_MONITORING END_MONITORING
---------- ---------- ------ ------ ------------------------------ ------------------------------
IDX_T_01 T YES YES 07/22/2020 14:15:18
如果不再需要监控该索引,可以这样取消该索引的监控:
alter index jingyu.IDX_T_01 nomonitoring usage;
INDEX_NAME TABLE_NAME MONITO USED START_MONITORING END_MONITORING
---------- ---------- ------ ------ ------------------------------ ------------------------------
IDX_T_01 T NO NO 07/22/2020 14:30:30 07/22/2020 14:30:58
优点:简单,能有效监控整个业务周期内索引是否被使用到,如果没有被使用则可以放心删除。
缺点:只能判断是否被使用到,不能判断索引使用频率。
2.2 将删除索引先修改为不可见
将计划要删除的索引设置为不可见(invisible),然后经历至少一个业务周期(具体业务确认业务周期为多久,注意要考虑到跑批场景)的观察,确认没有影响,则可以考虑彻底删除。
设置索引IDX_T_01不可见:
alter index jingyu.IDX_T_01 invisible;
执行演示SQL发现已经是全表扫:
explain plan for select object_id from t where object_id = 3;
select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 | 143 | 283 (2)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| T | 11 | 143 | 283 (2)| 00:00:04 |
--------------------------------------------------------------------------
恢复索引IDX_T_01可见:
alter index jingyu.IDX_T_01 visible;
执行演示SQL发现又恢复了索引访问,无需重建:
explain plan for select object_id from t where object_id = 3;
select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 2968633466
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IDX_T_01 | 1 | 13 | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------
优点:因为invisible索引只是让优化器不可见,索引段中的数据依然存在且DML操作也会维护这些invisible的索引,所以回退(直接修改该索引为可见)非常方便。
缺点:如果删除索引是为了更快加载数据,那么设置索引invisible期间,并不会提升效率。另外应用会话如果有设置OPTIMIZER_USE_INVISIBLE_INDEXES=TRUE的参数,也会用到invisible索引,而这可能会造成误判,需要特别注意。
3.根本解决方案及建议
删除索引的情景一般是考虑到索引数量过多,从而导致索引维护成本和空间使用成本增加。一般原则是首先评估删除冗余索引,比如某张表同时有两个索引,索引A是c1列,索引B是c1,c2两列的复合索引,则一般可以选择删除索引A;但需要注意,如果索引B是c2和c1列的复合索引,就通常不可以删除索引A。其次,对其他计划删除的索引可以按照上文的规范来评估和操作。
Oracle删除索引规范的更多相关文章
- oracle删除当前用户以及当前用户所有表、索引等操作
ORACLE删除当前用户下所有的表的方法 如果有删除用户的权限,则可以: drop user user_name cascade; 加了cascade就可以把用户连带的数据全部删掉.删除后再创建该用户 ...
- Oracle如何创建索引、删除索引、查询索引
1.创建单一索引 create index 索引名称 on 表名(列名); 2.创建复合索引 create index 索引名称 on 表名(列名1,列名2); 3.删除索引 drop index 索 ...
- oracle创建、删除索引等操作
1.创建索引 create index 索引名 on 表名(列名); 2.删除索引 drop index 索引名; 3.创建组合索引 create index 索引名 on 表名(列名1,,列名2); ...
- Oracle索引梳理系列(七)- Oracle唯一索引、普通索引及约束的关系
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- oracle 创建索引思考(转)
在Oracle数据库中,创建索引虽然比较简单.但是要合理的创建索引则比较困难了. 笔者认为,在创建索引时要做到三个适当,即在适当的表上.适当的列上创建适当数量的索引.虽然这可以通过一句话来概括优化的索 ...
- SQL Server,Oracle,DB2索引建立语句的对比
原文引至:http://jvortex.blog.163.com/blog/static/16961890020122141010878/ 我们知道,索引是用于加速数据库查询的数据库对象.原理就是减少 ...
- Oracle 重建索引脚本
该指数是一个有力的武器,以提高数据库的查询性能. 没有索引,喜欢同样的标签库没有书籍,找书,他们想预订比登天还难.中,尤其是在批量的DML的情形下会产生对应的碎片.以及B树高度会发生对应变化.因此能够 ...
- [转]Oracle 重建索引的必要性
http://blog.csdn.net/leshami/article/details/23763963 索引重建是一个争论不休被不断热烈讨论的议题.当然Oracle官方也有自己的观点,我们很多DB ...
- ORACLE虚拟索引(Virtual Index)
ORACLE虚拟索引(Virtual Index) 虚拟索引概念 虚拟索引(Virtual Indexes)是一个定义在数据字典中的假索引(fake index),它没有相关的索引段.虚拟索引的目 ...
- Oracle删除重复行
Oracle删除重复行 分类: ORACLE2010-12-12 17:10 423人阅读 评论(0) 收藏 举报 oracletabledeleteintegerinsert.net 查询及删除重复 ...
随机推荐
- nginx安装 没有网络且缺少基础包的环境下
一.安装 [root@oracle ~]# cd /etc/yum.repos.d/ [root@oracle yum.repos.d]# rm -rf * [root@oracle yum.repo ...
- vue学习笔记 七、方法的定义和使用
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- 开发中history和location
- 人人都会Kubernetes(二):使用KRM实现快速部署服务,并且通过域名发布
1. 上节回顾 上一小节<人人都会Kubernetes(一):告别手写K8s yaml,运维效率提升500%>介绍了KRM的一些常用功能,并且使用KRM的DEMO环境,无需安装就可以很方便 ...
- Spring Boot Actuator 使用和常用配置
转载请注明出处: Spring Boot Actuator是Spring Boot提供的一个非常强大的工具,它可以帮助我们监控和管理我们的Spring Boot应用.Actuator提供了一系列的端点 ...
- [转帖]Web技术(七):如何使用并实现MQTT 消息订阅-发布模型?
文章目录 一.什么是发布-订阅消息模型? 二.订阅-发布消息模型有哪些应用? 2.1 应用于IP 物联网络中的消息传递 2.2 应用于操作系统进程间的消息传递 2.3 应用于MESH 自组网中的消息传 ...
- [转帖]如何通过JMeter测试金仓数据库KingbaseES并搭建环境
1.安装JMeter Apache JMeter是Apache组织开发的基于Java的压力测试工具,主要用于对软件的压力测试,它最初被设计用于Web应用测试,但后来扩展到其它测试领域.它可测试静态.动 ...
- [转帖]浅谈RAID写惩罚(Write Penalty)与IOPS计算
https://www.dell.com/community/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8%E5%92%8C%E4%BF%9D%E6%8A%A4-%E8%B ...
- [转帖]Docker:Python环境Docker镜像瘦身
https://www.jianshu.com/p/c0ad13e0be85 关键字:Docker,Python 原始镜像 封装一个Python 3.7的环境并且安装Python依赖包实现一个机器学习 ...
- 【转帖】python 安装whl文件
前言 WHL文件是以Wheel格式保存的Python安装包,Wheel是Python发行版的标准内置包格式.在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的p ...