问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Oracle中不使用索引的几种情况分析

发布网友 发布时间:2022-04-08 03:45

我来回答

2个回答

懂视网 时间:2022-04-08 08:07

 

java企业级通用权限安全框架源码 SpringMVC mybatis or hibernate+ehcache shiro druid bootstrap HTML5

 

【java框架源码下载】

 

Oracle不走索引的原因

标签:

热心网友 时间:2022-04-08 05:15

Oracle不使用b*tree索引的情况大致如下1:where条件中和null比较可能导致不使用索引2:count,sum,ave,max,min等聚集操作时可能导致不使用索引3:显示或者隐式的函数转换导致不使用索引4:在cbo模式下,统计信息过于陈旧导致不使用索引5:组合索引中没有使用前导列导致没有使用索引6:访问的数据量超过一定的比例导致不使用索引下面就其中的几点做一些说明一:Null可以使用索引吗一般情况下,where条件中和null比较将会导致fulltablescan,实际上,如果table中索引建列的值都为null,那么该行在索引(此处指b*tree,位图索引和聚簇索引可以有空值)中就不会存在,因此oracle为了保证查询结构的准确性,就会用full table scan代替index scan,这样理解,不走索引也就在情理之中。当然,如果某个索引列上有定义为not null,在这种情况下,不存在所有索引列都为空的情况,所以此种情况下,是可以走index scan的,因此,对于where条件中含有类似is null,=null的情况,是否走索引,还是要看索引建中是否有某个列定义为not null。具体实验如下:SQL> create table t(x char(3),y char(5));SQL> insert into t(x,y) values ('001','xxxxx');SQL> insert into t(x,y) values ('002',null);SQL> insert into t(x,y) values (null,'yyyyy');SQL> insert into t(x,y) values (null,null);SQL> commit;SQL> create unique index t_idx on t(x,y);SQL> analyze table t compute statistics for table for all indexes;SQL> select blevel,leaf_blocks,num_rows from user_indexes where index_name=upper('t_idx'); BLEVEL LEAF_BLOCKS NUM_ROWS---------- ----------- ---------- 0 1 3isnert四条记录,但索引只保存3条,最后一条没有保存在索引中SQL> set autotrace traceonly explain;SQL> select * from t where x is null;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1 Bytes=8) 1 0 TABLE ACCESS (FULL)OF 'T' (Cost=2 Card=1 Bytes=8) SQL> create table t1(x char(3),y char(5) not null);SQL> insert into t1(x,y) values ('001','xxxxx');SQL> insert into t1(x,y) values (null,'xxxxx');SQL> commit;SQL> create unique index t1_idx on t1(x,y);SQL> analyze table t1 compute statistics for table for all indexes;SQL> select blevel,leaf_blocks,num_rows from user_indexes where index_name=upper('t1_idx'); BLEVEL LEAF_BLOCKS NUM_ROWS---------- ----------- ---------- 0 1 2SQL> select * from t1 where x is null;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=11) 1 0 INDEX (RANGE SCAN) OF 'T1_IDX' (UNIQUE)(Cost=1 Card=1 Byt二:COUNT(*)等聚集函数可能导致不使用索引在做count,sum,ave,max,min等聚集操作时,有的时候也会不用索引,因为如果优化器发现索引列没有任何一个列定义为not null,而且where条件中也没有索引键列,如x=x,在此情况下,索引扫描结果会不准确,此时oracle就会用全表full table scan。沿用上面的二个表来说明SQL> select count(*) from t;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'T'(Cost=2 Card=4) SQL> select sum(x) from t;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1 Bytes=5) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'T'(Cost=2 Card=4 Bytes=20)因为该表的索引列(x,y)没有定义为not null,所以都走了全表扫描,即使把x=null,y=null的行删除,同样还是走全表扫描。SQL> delete t where x is null and y is null;已删除1行。CommitSQL> analyze table t compute statistics for table for all indexes;SQL> select count(*) from t;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'T'(Cost=2 Card=3) 同样的sql语句,对于t1表,因为索引列y定义为not null,所以oracle会选择index scanSQL> select count(*) from t1; Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1) 1 0 SORT (AGGREGATE) 2 1 INDEX (FULL SCAN) OF 'T1_IDX' (UNIQUE)(Cost=1 Card=2)SQL> select sum(x) from t1;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=5) 1 0 SORT (AGGREGATE) 2 1 INDEX (FULL SCAN) OF 'T1_IDX' (UNIQUE)(Cost=1 Card=2 By tes=10)三:隐式或者显示的函数转换降导致全表扫描SQL> Select * from t1 where x=001;X Y COMM------ ---------- ----------------------------001 xxxxx 88888Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=2 Card=1 Bytes=26) 1 0 TABLE ACCESS (FULL) OF 'T1'(Cost=2 Card=1 Bytes=26)因为x为char类似,在这里oracle把x=001做了隐式转换to_number(x)=001,建在该字段的索引将不起作用,基于函数的索引(function based index)可以在此派上用场,相对于普通索引,fbi是把经过函数转换后的值存放到索引中SQL> create index t1_fbi on t1(to_number(x));SQL> analyze table t1 compute statistics for table for all indexes;SQL> Select * from t1 where x=001;X Y COMM------ ---------- ----------------------------001 xxxxx 88888Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT ptimizer=CHOOSE (Cost=1 Card=1 Bytes=26) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T1' (Cost=1 Card=1 Bytes =26) 2 1 INDEX (RANGE SCAN) OF 'T1_FBI'(NON-UNIQUE) (Cost=1 Card =1)四:统计信息不是最新的,导致无法使用五:组合索引中没有用到前导列导致没有用索引,如组合索引(x,y),where条件类似where y=….,此时不走索引(如果x的不同值很少,那么oracle9i以后就有可能走index skip scan,其原理类似于select * from t where y=…and x=(某个确定的值) union all select * from t where y=…and x=(某个确定的值)……..六:访问的数据比例超过一定范围,优化器会认为full table scan的成本更低,此事走索引扫描反而会使总成本变大,因此,索引用来快速访问表中的少量记录,对于访问表中的大量记录是不适合用索引的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我现在九十斤每天跑半小时可以减肥吗? 一只蛋鸡吃多少饲料 永诚财险水滴重疾2021值得推荐吗?重疾赔付次数有多少? 瑞泰保险水滴瑞选重疾险好不好?值得买吗? 水滴守护真爱重大疾病保障计划值得推荐吗?可靠吗? 去西塘和乌镇 为什么生死狙击花圣总是玩人类 江门豪江华庭带装修吗? 江门豪江华庭售楼中心电话是多少? 这种美图软件叫什么? 飞机上能带一个10000毫安的充电宝和一个20000毫安的充电宝上飞机吗? 50000ma充电宝可以带上飞机吗 WPS无法保存? Wps表格文件无法保存 哈弗H6值得买吗?先看看口碑怎么样 高中数学好难,我该怎么办?况且到了高中睡眠时间不足上课又没精神,我真的怕我自己成绩会下降,求大神指 我是高中理科生,今年复读,求一套学习方法 高三和高一高二比起来有什么不同吗。学生的成绩会怎么变化。求详解 高三是学生高考的关键一年,在高一高二该如何学习呢? 高中了,学习很困难,大家告诉我该怎么办??由成绩坏转为成绩好的学哥学姐进!!~~ 眼部精华液和眼霜有什么区别?25岁的女女用哪个比较好? 眼霜与眼部肌底精华液的区别 眼霜和眼部精华素的区别是什么? 高中三年是不是很辛苦? 眼部精华和眼霜有什么区别? 眼霜和眼精华有什么区别? 梦见蛇被别人灌吃了好多盐,我有让它喝了好多水啥意思 高一是坎,高二是坡,高三是山峰,你是这样学习的吗 眼部精华液和眼霜有什么区别 梦见我养的蚯蚓,被别人养的蛇吃了。求解梦 网上商城如何推广 怎么用幽默的语句祝福生日快乐啊 快快 祝女孩子生日快乐的句子幽默风趣的 养胃的食物那么多,该吃哪些美食可以养胃? 搞笑的短句祝福别人生日快乐 生日快乐经典短句搞笑 时代芳华什么意思? 沈阳哪家养老院最好?? 沈阳时代芳华养老管理有限公司怎么样? 四川时代芳华建设工程有限公司怎么样? 历史沉浮,为什么只有寿山田黄彰显波澜不惊呢? kindle电脑导入电子书在app不显示 须眉羞若何 弱女息千戈 出自哪里 家国情怀已成为元宵节最美底色了吗? 拷贝的书kindle生词本不显示在首页 杭州中交理想时代芳华怎么样?好不好?值不值得买? 致敬芳华是什么意思 杭州中交理想时代芳华交通方便吗?应该怎么过去? word中的加粗达不到需要的粗度,有什么方法可以使字变得更粗吗 世上有朵美丽的花,那是青春吐芳华,如何评价冯小刚执导的电影《芳华》?