oracle or索引失效_ORACLE索引失效的问题分析
一、问题发现
2月16日现场同事发现某个tablespace空间快要耗尽,让我们手工清楚些数据,腾出足够空间,等用户有预算添加磁盘。该问题年前已经处理过一次,我们已经将数据保留期限做了缩减,按道理不会这么快出现磁盘空间耗尽的情况。我猜测可能是自动分区程序没有运行,没有自动删除旧分区,而新数据又不断产生,导致磁盘空间被逐渐耗尽。
看出从2011-02-02开始到16号这段时间分区维护没有执行,导致空间满。
于是通知集成组同事运行自动分区维护程序。
自动分区维护运行后,空间使用率低于80%了。问题解决了。
过了1小时,现场同事又反映采集程序卡住不动了,让我们赶紧核查原因,排除故障,给出故障报告。
二、问题分析
首先想到的是不是哪个表被锁住了。
select * from v$locked_object t1,user_objects t2
where t1.object_id=t2.object_id
通过语句查到,确实有很多相关表被锁住了。
继续查是哪些语句锁住了表
select sid,
v$session.username 用户名,
last_call_et 持续时间,
status 状态,
LOCKWAIT 等待锁,
machine 用户电脑名,
logon_time 开始登入时间,
sql_text
from v$session, v$process, v$sqlarea
where paddr = addr
and sql_hash_value =
hash_value
and status = 'ACTIVE'
and v$session.username is not
null
order by last_call_et desc;
发现有个delete语句在执行,该delete语句为:
delete from table1 where column1=? and column2=? and
column3=?
看该语句的执行计划,发现是全表扫描,没有走索引。
我们估计是不是索引失效了
select status,T.* from user_indexes T
where table_name='TABLE1'
发现status='INVALID'失效。
重建该索引:
drop index ......
create index ......
问题解决。
是什么问题导致的索引失效呢?该问题是运行分区维护后发生的,于是把该问题转给了开发自动分区管理的同事了。该问题后续再补充。
三、知识点总结
1.如何判断和确认索引失效?
通过查看user_indexes的status来确定用户索引状态。
分区索引查看DBA_IND_PARTITIONS的status来确定。
2.重建索引的方式有哪些,有什么区别?
1)drop index...和create index
2)alter index idx_name rebuild
3)alter index idx_name rebuild online
a)rebuild会阻塞对基表的DML操作,但不会影响rebuild期间查询对原有索引的使用。
b)rebuild的数据源可能是基表,也可能是原索引。取决于基表和原索引的大小,那个小,rebuild时就会用那个作为数据源。
c)rebuild online运行用户在索引重建期间执行DML操作。
d)rebuild online的数据源是基表。
3.导致索引失效的原因有哪些?原因:当某些操作导致数据的rowid改变,索引就会完全失效。
那什么时候会导致rowid改变使得索引unuseable或者invalid呢?
一般普通表在在如下3个情况下可以使index unusable
1)move 【alter table move】【alter table t02 move tablespace
tbs01;】
2)sqlldr 【sqlldr ( parallel or direct )append 】【sqlldr direct=y +
主键重复】
3)手动alter index unusable
对分区表,又要分local index和globa index来说
1)首先上面的导致普通表上的索引失效的原因对分区表也同样适用.
2)对local index在exchange without including
indexes的时候也会unusable
3)global index在partition mt的时候会导致unusable[除非加上update global
indexes]
以下为引用:
1.导致的原因:
在SQL*LOADER 加载过程中会维护索引,由于数据量比较大,在SQL*LOADER 加载过程中出现异常情况,导致ORACLE
来不及维护索引,导致索引处于失效状态,影响查询和加载。 异常情况主要有:在加载过程中杀掉SQL*LOADER
进程,重启,表空间不够等。
2. global索引,当global 索引所在表执行alter table
涉及下列操作时,会导至该索引失效:
? ADD PARTITION | SUBPARTITION
? COALESCE PARTITION | SUBPARTITION
? DROP PARTITION | SUBPARTITION
? EXCHANGE PARTITION | SUBPARTITION
? MERGE PARTITION | SUBPARTITION
? MOVE PARTITION | SUBPARTITION
? SPLIT PARTITION | SUBPARTITION
? TRUNCATE PARTITION | SUBPARTITION
因此,建议用户在执行上述操作sql 语句后附加update indexes 子句,oracle 即会自动维护全局索引。
3. 执行alter table 时未指定update indexes 子句:
如果是range/list 分区,其local 索引和global 索引不会受影响;
如果是hash 分区,新加分区及有数据移动的分区的local 索引和glocal 索引会被置为unuseable,
需要重新编译
对于分区表中索引失效要重建索引
select 'alter index '||t.index_name||' rebuild partition
'||t.partition_name from user_ind_partitions t where
t.index_name='IDX_PART2' and
t.status='unusable'
查出来后,在命令窗口执行。查出来的语句就可以了。
oracle or索引失效_ORACLE索引失效的问题分析相关推荐
- oracle组合索引失效_oracle 索引失效原因
1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上,或者对索引列进 ...
- mysql in or索引失效_in 索引失效的问题
简单的in查询 索引失效: 步骤 1.检查建立索引没有 order_status 字段为普通索引的tinyint类型 2.检查是否使用了使索引失效的语句 3.explain查看执行计划 而 in(1) ...
- sql语句分析是否走索引_SQL Server 索引使用分析(2)- 改善SQL语句,防止索引失效...
原文出处 改善SQL语句 很多人不知道SQL语句在sql server中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 whe ...
- mysql in 索引 失效_in 索引失效的问题
简单的in查询 索引失效: 步骤 1.检查建立索引没有 order_status 字段为普通索引的tinyint类型 2.检查是否使用了使索引失效的语句 3.explain查看执行计划 而 in(1) ...
- 索引的使用—— 验证索引提升查询效率 || 避免索引失效 —— 全值匹配 /最左前缀法则/范围查询右边的列,不能使用索引/不要在索引列上进行运算操作/字符串不加单引号,造成索引失效
索引的使用 索引是数据库优化最常用也是最重要的手段之一, 通过索引通常可以帮助用户解决大多数的MySQL的性能优化问题 验证索引提升查询效率 查询速度很快,接近0s ,主要的原因是因为id为主键,有索 ...
- is NULL , is NOT NULL 有时索引失效 || in 走索引, not in 索引失效 ||单列索引和复合索引 || 查看索引使用情况
is NULL , is NOT NULL 有时索引失效 in 走索引, not in 索引失效 单列索引和复合索引 尽量使用复合索引,而少使用单列索引 数据库会选择一个最优的索引(辨识度最高索引)来 ...
- mysql索引失效_MySQL索引失效的底层原理详解,终于有人讲清楚了
前言 吊打面试官又来啦,今天我们讲讲MySQL索引为什么会失效,很多文章和培训机构的教程,都只会告诉你,在什么情况下索引会失效. 比如:没遵循最佳左前缀法则.范围查询的右边会失效.like查询用不到索 ...
- mysql数据索引失效_MySQL索引失效的几种情况
1.索引无法存储null值 a.单列索引无法储null值,复合索引无法储全为null的值. b.查询时,采用is null条件时,不能利用到索引,只能全表扫描. 为什么索引列无法存储Null值? a. ...
- order by使用索引列排序时会失效吗?
order by使用索引列排序时会失效吗? 在使用order by对某列进行排序时, 其sql一定进行了多表联查的操作. 说白了肯定做了表关联. 既然有表关联, 那order by排序就可以对任意的表 ...
最新文章
- jQuery源码分析-each函数
- 光纤收发器的原理及应用_光纤收发器的几种常规应用
- Wince6.0p上用ASP技术实现Webserver
- 2021年中国手机游戏行业研究报告
- 小程序坑集【日常总结,持续更新(11.08更新)】
- python signal
- 实体经济不改变经营思路和销售模式
- hashCode方法的使用
- 软件项目管理 project 实验
- 软考程序员资源免费分享
- 租号服务器未响应,租号玩启动不了wegame
- Python Computer Vision Programming学习笔记(一)——Python以及各Package安装
- led大屏按实际尺寸设计画面_LED显示屏尺寸规格及计算方法
- 【CV Transformer 论文笔记】Intriguing Properties of Vision Transformers
- 微信小程序checkbox调整大小
- 微信小程序—收藏功能
- 6.Spring Cloud初相识-------Zool路由
- 信息论 | 计算离散信源的信息量和熵的MATLAB实现(函数封装调用)
- Spring/SpringBoot系列之Spring中涉及的9种设计模式【七】
- 【转】PHP PDO 学习笔记
热门文章
- python-纸牌小游戏练习题
- Linux网络服务(中)FTP服务配置
- 高校教师工资管理系统java_基于jsp的高校职工工资管理系统-JavaEE实现高校职工工资管理系统 - java项目源码...
- private关键字:确保数据的安全(进行安全性把关)
- 通达信股票接口盘后数据下载流程是怎么样的?
- 基于Java+Swing+Mysql实现汽车信息管理系统
- 【解决回车键出现乱码的问题】禁用Enter键触发form表单提交的问题 ,同时启用保留textarea换行操作
- 手机毒霸去广告功能分析二:广告View的识别
- ManageEngine 详解IT服务管理(ITSM)流程五阶段
- VTP(VLAN Trunking Protocol)