oracle数据库索引失效_oracle

今天一个同事突然问我索引为什么失效。说实在的,失效的原因有多种:

但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况:

1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表)

2. 统计信息失效      需要重新搜集统计信息

3. 索引本身失效      需要重建索引

下面是一些不会使用到索引的原因

索引失效
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; 这时函数索引起作用了 1,<> 2,单独的>,<,(有时会用到,有时不会)
3,like "%_" 百分号在前.
4,表没分析.
5,单独引用复合索引里非第一位置的索引列.
6,字符型字段为数字时在where条件里不添加引号.
7,对索引列进行运算.需要建立函数索引.
8,not in ,not exist.
9,当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
10, 索引失效。
11,基于cost成本分析(oracle因为走全表成本会更小):查询小表,或者返回值大概在10%以上
12,有时都考虑到了 但就是不走索引,drop了从建试试在
13,B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走
14,联合索引 is not null 只要在建立的索引列(不分先后)都会走,
in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,
其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),
或者=一个值;当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),
以上两种情况索引都会走。其他情况不会走。

时间: 2024-10-03 03:47:33

oracle数据库索引失效_oracle的相关文章

Oracle数据库索引的维护_oracle

正在看的ORACLE教程是:Oracle数据库索引的维护. 本文只讨论Oracle中最常见的索引,即是B-tree索引.本文中涉及的数据库版本是Oracle8i. 一. 查看系统表中的用户索引 在Oracle中,SYSTEM表是安装数据库时自动建立的,它包含数据库的全部数据字典,存储过程.包.函数和触发器的定义以及系统回滚段. 一般来说,应该尽量避免在SYSTEM表中存储非SYSTEM用户的对象.因为这样会带来数据库维护和管理的很多问题.一旦SYSTEM表损坏了,只能重新生成数据库.我们可以用下

索引和检索 无效-关于oracle数据库索引

问题描述 关于oracle数据库索引 执行sql如下: select * from lm3.cc03 where aae017 in ( select distinct natl.jgid from be3.agency_natl natl, be3.agency_config conf where natl.jgid = conf.jgid and conf.ywlb = '02' start with natl.jgid = '37100106' connect by prior conf.

Oracle数据库索引创建要做到三个适当

在Oracle数据库中,创建索引虽然比较简单.但是要合理的创建索引则比较困难了.笔者认为,在创 建索引时要做到三个适当,即在适当的表上.适当的列上创建适当数量的索引.虽然这可以通过一句话来 概括优化的索引的基本准则,但是要做到这一点的话,需要数据库管理员做出很大的努力.具体的来说, 要做到这个三个适当有如下几个要求. 一. 根据表的大小来创建索引. 虽然给表创建索引,可以提高查询的效率.但是数据库管理员需要注意的是,索引也需要一定的开销 的.为此并不是说给所有的表都创建索引,那么就可以提高数据库

Oracle数据库的安全策略_oracle

正在看的ORACLE教程是:Oracle数据库的安全策略. ---- Oracle是关系型数据库管理系统,它功能强大.性能卓越,在当今大型数据库管理系统中占有重要地位.在我们开发的一MIS系统中,选用了Oracle7.3数据库.在正常情况下,Oracle数据库会保证数据的安全.稳定,为用户提供正确的数据,但由于计算机系统的故障(硬件故障.软件故障.网络故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失,整个系统都将处于瘫痪状态.因此,如何

Oracle数据库迁移方案_oracle

1 在数据迁移时,用户首先有权限修改数据库,并且进行表空间创建.删除等权利 例如: select * from dba_tab_privs where grantee='SCOT'; ---查看SCOTT权限(sys用户登录) 显示结果为: select * from dba_role_privs where grantee='SCOT'; --查看SCOTT角色 显示结果为: (1) 如果用户被锁定通过以下语句来解锁表 alter user scott account unlock; --解锁

Oracle数据库的备份与恢复_oracle

正在看的ORACLE教程是:Oracle数据库的备份与恢复. ---- 当我们使用一个数据库时,总希望数据库的内容是可靠的.正确的,但由于计算机系统的故障(包括机器故障.介质故障.误操作等),数据库有时也可能遭到破坏,这时如何尽快恢复数据就成为当务之急.如果平时对数据库做了备份,那么此时恢复数据就显得很容易.由此可见,做好数据库的备份是多么的重要,下面笔者就以ORACLE7为例,来讲述一下数据库的备份和恢复.ORACLE 数据库有三种标准的备份方法,它们分别为导出/导入(EXPORT/IMPOR

C#利用ODP.net连接Oracle数据库的操作方法_oracle

本文介绍了C#连接Oracle数据库的过程.通过instant client和ODP.net中的Oracle.DataAccess.dll,我们就可以方便的部署.net应用程序或者站点,而不需要安装Oracle客户端.接下来我们就介绍这一过程. 1. ODAC的安装 在oracle的官方网站上下载与你安装的oracle对应版本的ODAC. 下载地址:ODAC Download 下载好后解压安装,安装时不用安装全部的组件.主要安装以下组件: Oracle Instant Client Oracle

Oracle数据库技术(38)_oracle

正在看的ORACLE教程是:Oracle数据库技术(38). 作者:未知 更新人:Finishing 来源:不详 更新时间:2004.07.06 投稿信箱: jc@ddvip.net   <

linux oracle数据库删除操作指南_oracle

Linux操作系统下完全删除Oracle数据库详述: 1.关掉oracle server 和 background processes ps -ef | grep ora 关掉数据库 shutdown immediate 2.关掉监听 lsnrctl status 如果开启的话就执行lsnrctl stop 关掉 3.把$ORACLE_HOME下面的文件删掉 用dbca图形界面把数据库删掉 4.把/usr/local/bin 下的三个文件夹 dbhome oraenv coraenv删掉 rm