郑州云拓网站建设公司,网站seo排名公司,wordpress两侧有空白,网站建设招标2017一、以下的方法会引起索引失效1,2,单独的,3,like %_ 百分号在前.4,表没分析.5,单独引用复合索引里非第一位置的索引列.6,字符型字段为数字时在where条件里不添加引号.7,对索引列进行运算.需要建立函数索引.8,not in ,not exist.9,当变量采用的是time…一、以下的方法会引起索引失效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 一个值),以上两种情况索引都会走。其他情况不会走。二、索引失效解决方法1. 选用适合的Oracle优化器Oracle的优化器共有3种:a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性)。设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULECOSTCHOOSEALL_ROWSFIRST_ROWS 。你当然也在SQL句级或是会话(session)级对其进行覆盖。为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性。如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器。(分析tableanalyze table PROD_PARTS compute statistics;ANALYZE TABLE PROD_PARTS COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;analyze table PROD_PARTS compute statistics for table for all indexes for all indexed columns;)【有一次索引失效之后请教DBA后发现是数据统计的问题具体的解决办法是执行以上语句】在缺省情况下,Oracle采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan), 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。2、重建索引alter index 索引名 rebuild 【online】3、强制索引给该语句加上hint后强制其使用RECORD_ENTITYID 这个索引sql语句变成这样引用select /* index(record,record_entityid) */ *from RECORDwhere entityId24 and entityTypeblog;/* index(record,record_entityid) */ 中index表示强制使用indexrecord是表名record_entityid是索引名。其执行计划跟测试数据库上一致都是使用用 RECORD_ENTITYID 这个索引逻辑读写同样为4。后来经过测试在不加hint的情况下对该表和两个索引执行analyze 后同样也能使用 RECORD_ENTITYID 这个索引。但是因为该表更新颇为频繁不知道要多久就要再分析一次但是如果是同样的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_mdn13333333333; 正确的例子select * from test where tu_mdn13333333333; 11)对索引列进行运算导致索引失效,我所指的对索引列进行运算包括(-*/! 等) 错误的例子select * from test where id-19; 正确的例子select * from test where id10; 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,单独的,以上两种情况索引都会走。其他情况不会走。