Oracle 索引的失效和重建

查询指定表的索引

SELECT T1.TABLE_NAME,
T1.INDEX_NAME,
T1.INDEX_TYPE,
T1.UNIQUENESS,
T1.TABLE_OWNER,
T1.STATUS,
T1.FUNCIDX_STATUS
FROM ALL_INDEXES T1
WHERE T1.TABLE_OWNER = UPPER(‘&Owner‘)
AND T1.TABLE_NAME = UPPER(‘&Table_Name‘)
ORDER BY T1.STATUS DESC;

普通索引失效,主键和唯一性索引除外(为保障数据的规范性)

SELECT ‘ALTER INDEX ‘ || TABLE_OWNER || ‘.‘ || INDEX_NAME || ‘ UNUSABLE;‘ UNUSABLE_INDEX
FROM ALL_INDEXES
WHERE TABLE_OWNER = UPPER(‘&Owner‘)
AND TABLE_NAME = UPPER(‘&Table_Name‘)
AND INDEX_TYPE = ‘NORMAL‘
AND UNIQUENESS <> ‘UNIQUE‘;

并行(PARALLEL)重建索引,提升重建速度(在服务器空闲时执行)

SELECT ‘ALTER INDEX ‘ || TABLE_OWNER || ‘.‘ || INDEX_NAME ||
‘ REBUILD PARALLEL;‘
FROM ALL_INDEXES
WHERE TABLE_OWNER = UPPER(‘&Owner‘)
AND TABLE_NAME = UPPER(‘&Table_Name‘)
AND INDEX_TYPE = ‘NORMAL‘
AND UNIQUENESS <> ‘UNIQUE‘
AND STATUS = ‘UNUSABLE‘;

查询索引的状态和DEGREE并行度
注意:并行度默认设置为1,如果显示为default,表示数据库分配的cpu核心*2,重建完索引后并行度都改成1

SELECT ROWNUM,
S.INDEX_NAME,
S.INDEX_TYPE,
S.TABLE_OWNER,
S.TABLE_NAME,
S.UNIQUENESS,
S.STATUS,
S.DEGREE,
S.TABLESPACE_NAME
FROM ALL_INDEXES S
WHERE TABLE_OWNER = UPPER(‘&Owner‘)
AND TABLE_NAME = UPPER(‘&Table_Name‘);

将索引并行度不是1的还原回1

SELECT ‘ALTER INDEX ‘ || S.TABLE_OWNER || ‘.‘ || S.INDEX_NAME ||
‘ NOPARALLEL;‘
FROM ALL_INDEXES S
WHERE TABLE_OWNER = UPPER(‘&Owner‘)
AND TABLE_NAME = UPPER(‘&Table_Name‘)
AND S.DEGREE <> 1;
时间: 2024-12-28 10:32:00

Oracle 索引的失效和重建的相关文章

ORACLE关于索引是否需要定期重建争论的整理

ORACLE数据库中的索引到底要不要定期重建呢? 如果不需要定期重建,那么理由是什么? 如果需要定期重建,那么理由又是什么?另外,如果需要定期重建,那么满足那些条件的索引才需要重建呢?关于这个问题,网上也有很多争论,也一直让我有点困惑,因为总有点不得庐山真面目的感觉,直到上周看到了一些资料,遂整理于此,方便以后翻阅: 首先来看看网上关于索引需要重建的原因或标准: 一:分析(analyze)指定索引之后,查询index_stats的height字段的值,如果这个值>=4 ,最好重建(rebuild

oracle 索引失效原因

摘自网络http://blog.chinaunix.net/uid-23622436-id-3184356.html oracle 索引失效的原因 分类: Oracle 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上(见12) 6) 对小表查询 7) 提示不使用索引 8) 统计数据不真实 9) CBO计算走索引花费过大的情况.其实也包含了上面的情况,这里指的是

Oracle性能分析10:重建索引续-常用SQL

上一节讲了重建索引的原因和重建方法,这节继续介绍几个常用的SQL语句和存储过程. 查询所有失效的全局索引 select index_name, status from user_indexes where table_name = upper(table_name) and status = 'UNUSABLE' 查询所有失效的分区索引 select index_name, status from user_ind_partitions where index_name in (select i

Oracle 索引失效的六大限制条件

[原创]能使 Oracle 索引失效的六大限制条件 Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时候却适得其反. 例如一张表中有上百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这可能是 oracle 索引失效造成的.oracle 索引有一些限制条件,如果你违反了这些索引限制条件,那么即使你已经加了索引,oracle还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差. 下面就是总结的能使 Oracle 索引失效

Oracle性能分析9:重建索引

当索引出现问题时,会导致严重的性能问题,索引问题包括索引不可用.索引碎片导致性能下降,我们需要一些手段在检测索引的问题,并解决这些问题.这一篇将为你讲述怎么定位索引问题,并提供了解决的办法. 索引不可用 索引不可用的原因有很多,包括: 1)索引空间耗尽,导致SQL*Loader更新索引失败: 2)创建索引的过程中实例失败: 3)唯一键有重复值: 4)某个索引的顺序与sorted indexes子句中指定的顺序不同: 5)移动表或表分区(alter table move和alter table m

Oracle 索引失效

Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时候却适得其反. 1. 没有 WHERE 子句 2. 使用 IS NULL 和 IS NOT NULL SELECT ... FROM emp WHERE comm IS NULL; comm 列的索引会失效 3. WHERE 子句中使用函数 如果没有使用基于函数的索引,那么 where 子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引.例如: select * from staff where trunc(birthdate)

oracle 索引失效原因_汇总

1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等) 错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10; 6) 对小表查询 7) 提示不使用索引 8) 统计数据不真实 9) CBO计算走索引花费过大的情况.其

oracle 索引基本原理

一.索引基本概念 oracle提供了两种方式:从表中读取所有行(即全表扫描),或者通过ROWID一次读取一行. 如果只访问大数据量表中的5%的行,并且使用索引标识需要读取的数据块,这样话费的I/O较少. 索引对性能改进的程度:1.取决于数据的选择性 2.数据在表的数据块中的分布方式 当数据分散在表的多个数据块中时,最好是不使用索引,而是选择全表扫描.执行全表扫描时,oracle使用多块读取以快速扫描表,基于索引的读是单块读.因此在使用索引时的目标是减少完成查询所需的单块读的数量. 增强索引会降低

oracle索引的理解

1.当查询表时where条件中有多个索引时,优先使用主键索引,其它索引会失效. 2.当查询的返回的数据占总量数据的百分比小于20%时,建索引才有效果 3.不是主键的索引值可以为空,主键索引不能为空. 4. 容易引起oracle索引失效的原因很多: 1).在索引列上使用函数.如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了. 2).新建的表还没来得及生成统计信息,分析一下就好了 3).基于cost的成本分析,访问的表过小,使用全表扫描的消耗小于使用索引.