SQL优化-索引篇

首先建立测试表
create table test_index(
       id number,
       name varchar2(200)
);

插入1500000测试数据

declare
       name varchar2(200);
       id number;
begin
  for i in 1..100*100*150 loop
    select test_index_s.nextval into id from dual;
    name := 'zhangsan'||id;
    insert into test_index(id,name) values(id,name);
  end loop;
end;
下面测试一下这条sql语句的执行效率

select * from test_index t where t.id = 1234566;
为了防止数据库已经缓存了查询结果,我们先清空一下缓存

--清空共享池
ALTER SYSTEM FLUSH SHARED_POOL;
--清空缓存池
ALTER SYSTEM FLUSH BUFFER_CACHE;
来看下SQL的执行消耗:

下面在ID列上建立索引

create index test_index_n on test_index(id);
清空缓存,再看看SQL的执行消耗


可以看出索引在数据量比较大的情况下对sql的执行效率有很大程度的影响

当然很多情况下会导致SQL不走索引

1.如索引列上存在null值,则不会走索引

update test_index t set t.id = null  where t.id = 100004;
不走索引

过滤掉null值,走索引

当所要查找的数据大于全部数据的10%左右的时候Oracle会自动选择执行效率较高的全表扫描


还有很多种情况会导致sql不走索引

like ‘%XXXXX%’ 不走索引

<> 使用不等于号,不走索引

数字列=字符串量 这种两边类型不一样,需要隐式转换时不走索引

等等,不一一列举了




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值