首先建立测试表
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%’ 不走索引
<> 使用不等于号,不走索引
数字列=字符串量 这种两边类型不一样,需要隐式转换时不走索引
等等,不一一列举了