[/b]一般情况,在大量数据割接完以后,会发生索引实效的情况。
查询dba_indexes表,其索引状态STATUS应该为VALID,如果是DISABLE或者unusable都为不正常索引。
如果是分区索引,可用以下语句进行查询。如下:
select t.Index_Name, t.Partition_Name, t.Tablespace_Name, t.Status
from Dba_Ind_Partitions t
where t.Index_Name = 'INX_SERV_PROD_PRPTY_2'
其中'INX_SERV_PROD_PRPTY_2'是索引名。
执行返回结果如下:
1 INX_SERV_PROD_PRPTY_2 PARTITION_1 RMS_INDX USABLE
2 INX_SERV_PROD_PRPTY_2 PARTITION_10 RMS_INDX USABLE
3 INX_SERV_PROD_PRPTY_2 PARTITION_11 RMS_INDX USABLE
4 INX_SERV_PROD_PRPTY_2 PARTITION_2 RMS_INDX USABLE
5 INX_SERV_PROD_PRPTY_2 PARTITION_3 RMS_INDX USABLE
6 INX_SERV_PROD_PRPTY_2 PARTITION_4 RMS_INDX USABLE
7 INX_SERV_PROD_PRPTY_2 PARTITION_5 RMS_INDX USABLE
8 INX_SERV_PROD_PRPTY_2 PARTITION_6 RMS_INDX USABLE
9 INX_SERV_PROD_PRPTY_2 PARTITION_7 RMS_INDX USABLE
10 INX_SERV_PROD_PRPTY_2 PARTITION_8 RMS_INDX USABLE
11 INX_SERV_PROD_PRPTY_2 PARTITION_9 RMS_INDX USABLE
可以查询到每个表分区的索引是否失效。
----
[b]以下原因经常导致索引状态不正常
1) alter table move
2) alter index disable
只有函数索引可以alter index disable,一般的应该是alter index unusable
3) truncate分区表上的全局索引
4) sqlldr ( parallel or direct )append 导入了重复数据但是索引有唯一约束
5) sqlldr insert /*+ append */
建议:alter index 索引名 rebuild online;
(B-tree索引:
·索引会随着时间的增加而变的不平衡;
·删除的索引空间不会被重用;
·随着索引层数的增加,索引将会变得无效并需要重建;
·聚簇因子差,索引需要重建;
·为提高性能,索引需要经常重建;
·假如聚簇因子过大,那么重建索引可能会有好处,聚簇因子应该接近块的数量,而非行的数
)
在上线后运行一段时期时候考虑一些大表的索引进行alter index 索引名 rebuild online 在线重建
9i以上oracle就建议用DBMS_STATS 包来代替ANALYZE 语句,如果使用ANALYZE做过分析可能会产生不是很好的分析效果
以下是一般不使用索引的几个常见原因:
1) 没有查询条件,或者查询条件没有建立索引
2) 在查询条件上没有使用引导列
3) 查询的数量是大表的大部分,应该是30%以上。
4) 索引本身失效
5) 查询条件使用函数在索引列上(见12)
6) 对小表查询
7) 提示不使用索引
8) 统计数据不真实
9) CBO计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。
10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.
由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效.
错误的例子:select * from test where tu_mdn=13333333333;
正确的例子:select * from test where tu_mdn='13333333333';
11)对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(+,-,*,/,! 等)
错误的例子:select * from test where id-1=9;
正确的例子:select * from test where id=10;
12)使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引.
错误的例子:select * from test where round(id)=10; 说明,此时id的索引已经不起作用了
正确的例子:首先建立函数索引,create index test_id_fbi_idx on test(round(id));
然后 select * from test where round(id)=10; 这时函数索引起作用了
分享到:
相关推荐
本篇将详细探讨10种可能导致MySQL数据库索引失效的常见场景,帮助你理解和避免这些问题。 **1. LIKE操作符的不当使用** 在查询语句中,如果使用LIKE操作符并且模式匹配出现在字符串的开头,索引可能无法被利用。...
2. 避免索引失效:使用函数、IN操作符、NOT操作符等可能导致索引失效,应尽量让索引列直接参与比较。 3. 选择正确的JOIN策略:了解不同JOIN类型的性能差异,如NLJOIN、HASH JOIN和MERGE JOIN。 五、实际应用中的...
数据库索引是数据库管理系统中用于加速数据检索的关键组件。它是一种特殊的文件,由数据库系统创建并维护,可以显著提高查询速度。索引通过对表中一列或多列的值进行排序,使得数据查找过程无需遍历整个表格。例如,...
2. 避免索引失效:避免在索引列上使用不兼容的操作,如函数、运算符或NULL值,这些会导致索引无法被使用。 3. 分区索引:对于大型表,可以采用分区技术,将数据分成多个逻辑部分,每个部分有自己的索引,提高查询...
Oracle数据库索引失效是一个常见的性能问题,它可能导致查询效率降低,影响系统的整体性能。索引失效可能是由多种原因引起的,理解这些原因并采取适当的预防措施至关重要。 首先,当WHERE子句中的条件筛选出的数据...
在MySQL数据库中,索引是提高查询效率的关键工具。它们为数据表的列提供了...了解各种索引类型、创建方法和可能导致失效的场景,可以帮助数据库管理员更好地管理和优化他们的数据库,从而提高查询效率和整体系统性能。
数据库索引是一种提高查询效率的重要手段,但是如果不正确使用索引,可能会导致索引失效,影响查询效率。以下是导致索引失效的七字口诀: 模型数空运最快嗷 1. 模:模糊查询的问题 使用like关键字进行查询的时候...
2. 避免索引失效:避免在索引列上使用非等值比较操作(如LIKE、BETWEEN)或函数,这可能导致索引无法被使用。 3. 分析和调整索引:定期进行性能分析,根据查询模式和数据分布调整索引结构和策略。 4. 使用分区和分片...
SELECT 'DBCC DBREINDEX('+TABLE_NAME+')'FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASETABLE'
### Oracle索引失效的原因及解决方法 在Oracle数据库中,索引是提高查询效率的关键工具之一。然而,在实际的应用过程中,由于多种原因可能会导致索引失效,从而影响系统的性能。本文将详细介绍Oracle索引失效的一些...
本文将重点探讨MySQL中索引失效的常见场景及其原因,并通过具体实例来帮助读者更好地理解和避免索引失效的问题。 #### 二、MySQL索引失效的原因 ##### 1. 使用了不适当的数据类型 如果列的数据类型与索引的数据...
本文将围绕为什么要进行SQL优化、如何找到慢SQL、如何分析SQL、回表与索引的概念以及什么情况下会造成索引失效等方面进行讲解。 对MySQL进行SQL优化是提高数据库性能的关键。通过找到慢SQL、分析SQL、合理使用索引,...
在面试过程中,常常会涉及到MySQL索引的相关问题,包括索引的原理、优化技巧以及索引失效的原因等。 首先,MySQL索引是一种数据结构,用于快速定位和访问数据库中的数据。它通过创建索引列和索引对象来实现,可以...
MySQL 索引失效详解 MySQL 索引是一种加快数据检索速度的数据库对象。索引可以大幅度提高查询效率,但是如果不正确使用索引,...同时,了解索引失效的原因和解决方法也非常重要,以便更好地优化查询语句和数据库性能。
在MySQL数据库中,索引是一种重要的优化手段,它能够显著...以上就是关于导致MySQL索引失效的一些常见情况及其避免方法。在实际工作中,我们需要结合具体业务场景和查询需求,合理设计和使用索引,以提高数据库性能。
导致索引失效: 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。