`
zpball
  • 浏览: 914718 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于数据库索引失效的问题

阅读更多

    一般情况,在大量数据割接完以后,会发生索引实效的情况。

查询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; 这时函数索引起作用了
分享到:
评论

相关推荐

    MySQL数据库索引失效的10种场景.zip

    本篇将详细探讨10种可能导致MySQL数据库索引失效的常见场景,帮助你理解和避免这些问题。 **1. LIKE操作符的不当使用** 在查询语句中,如果使用LIKE操作符并且模式匹配出现在字符串的开头,索引可能无法被利用。...

    数据库索引设计和优化

    2. 避免索引失效:使用函数、IN操作符、NOT操作符等可能导致索引失效,应尽量让索引列直接参与比较。 3. 选择正确的JOIN策略:了解不同JOIN类型的性能差异,如NLJOIN、HASH JOIN和MERGE JOIN。 五、实际应用中的...

    数据库索引失效的几种情况

    数据库索引是数据库管理系统中用于加速数据检索的关键组件。它是一种特殊的文件,由数据库系统创建并维护,可以显著提高查询速度。索引通过对表中一列或多列的值进行排序,使得数据查找过程无需遍历整个表格。例如,...

    数据库索引设计与优化

    2. 避免索引失效:避免在索引列上使用不兼容的操作,如函数、运算符或NULL值,这些会导致索引无法被使用。 3. 分区索引:对于大型表,可以采用分区技术,将数据分成多个逻辑部分,每个部分有自己的索引,提高查询...

    oracle数据库索引失效

    Oracle数据库索引失效是一个常见的性能问题,它可能导致查询效率降低,影响系统的整体性能。索引失效可能是由多种原因引起的,理解这些原因并采取适当的预防措施至关重要。 首先,当WHERE子句中的条件筛选出的数据...

    Mysql数据库索引创建、索引删除、索引失效场景详解

    在MySQL数据库中,索引是提高查询效率的关键工具。它们为数据表的列提供了...了解各种索引类型、创建方法和可能导致失效的场景,可以帮助数据库管理员更好地管理和优化他们的数据库,从而提高查询效率和整体系统性能。

    导致索引失效的口诀.pdf

    数据库索引是一种提高查询效率的重要手段,但是如果不正确使用索引,可能会导致索引失效,影响查询效率。以下是导致索引失效的七字口诀: 模型数空运最快嗷 1. 模:模糊查询的问题 使用like关键字进行查询的时候...

    数据库索引设计与优化,数据库必学经典

    2. 避免索引失效:避免在索引列上使用非等值比较操作(如LIKE、BETWEEN)或函数,这可能导致索引无法被使用。 3. 分析和调整索引:定期进行性能分析,根据查询模式和数据分布调整索引结构和策略。 4. 使用分区和分片...

    检查数据库索引.sql

    SELECT 'DBCC DBREINDEX('+TABLE_NAME+')'FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASETABLE'

    oracle索引失效的总结

    ### Oracle索引失效的原因及解决方法 在Oracle数据库中,索引是提高查询效率的关键工具之一。然而,在实际的应用过程中,由于多种原因可能会导致索引失效,从而影响系统的性能。本文将详细介绍Oracle索引失效的一些...

    mysql索引失效.docx MySQL索引失效是指在查询执行过程中,数据库无法有效地使用索引来提高查询性能

    本文将重点探讨MySQL中索引失效的常见场景及其原因,并通过具体实例来帮助读者更好地理解和避免索引失效的问题。 #### 二、MySQL索引失效的原因 ##### 1. 使用了不适当的数据类型 如果列的数据类型与索引的数据...

    数据库深入浅出MySQL SQL优化:原因、定位、分析与索引失效

    本文将围绕为什么要进行SQL优化、如何找到慢SQL、如何分析SQL、回表与索引的概念以及什么情况下会造成索引失效等方面进行讲解。 对MySQL进行SQL优化是提高数据库性能的关键。通过找到慢SQL、分析SQL、合理使用索引,...

    MySQL索引面试题+索引优化+索引失效

    在面试过程中,常常会涉及到MySQL索引的相关问题,包括索引的原理、优化技巧以及索引失效的原因等。 首先,MySQL索引是一种数据结构,用于快速定位和访问数据库中的数据。它通过创建索引列和索引对象来实现,可以...

    mysql 索引失效详解

    MySQL 索引失效详解 MySQL 索引是一种加快数据检索速度的数据库对象。索引可以大幅度提高查询效率,但是如果不正确使用索引,...同时,了解索引失效的原因和解决方法也非常重要,以便更好地优化查询语句和数据库性能。

    导致MySQL索引失效的一些常见写法总结

    在MySQL数据库中,索引是一种重要的优化手段,它能够显著...以上就是关于导致MySQL索引失效的一些常见情况及其避免方法。在实际工作中,我们需要结合具体业务场景和查询需求,合理设计和使用索引,以提高数据库性能。

    ORACLE数据库重建索引

    导致索引失效: 1、表上频繁发生update,delete操作; 2、表上发生了alter table ..move操作(move操作导致了rowid变化)。

Global site tag (gtag.js) - Google Analytics