sql查询性能小测试

测试环境为oracle10g

 

创建一个表

create table TEST_A
(
  ID   NUMBER(20),
  NAME VARCHAR2(20),
  CODE CHAR(20)
)

 

生成100W条数据,每个字段的值均为1到100W,进行如下性能测试。未创建索引之前的执行时间

select * from test_a t where id=219 --2.25s,1.7s
select * from test_a t where name='219' --2.391s ,1.7s
select * from test_a t where trim(code) = '219' --2.469s,2.172s

 均加上索引,后的执行时间

--behind add index
select * from test_a t where id=219 --0.016s
select * from test_a t where name='219' --0.016s
select * from test_a t where trim(code) = '219' --2.5s,2.172s
select * from test_a t where substr(code,0,3) = '219'--取出所有2.48s,前15条0.063s,0.03s
select * from test_a t where substr(code,0,6) = '100000'--2.297s,2.36s
 

初步说明NUMBER做主键类型与VARCHAR2的性能差别并不明显。(一般认为VARCHAR2的查询性能比CHAR和NUMBERS类型要差,后来测试使用VARCAHR(4000)数据达100W条时,性能也基本无差)

还说明在字段上使用函数,将查询使用不到索引,这点要特别注意! 通过查看执行计划,可以看使用的是全表扫描。

 

再测试一下count的性能。

select count(*) from test_a t --1.8s ,1.7s  --count(1)是一样的
select count(id) from test_a t --0.812s, 0.797s
select count(name) from test_a t --0.906s
select count(code) from test_a t --1.453s, 1.9s

 

没有过滤条件时, 对数据量大的表,少用count(*),尽量count主键索引的字段。

有过滤条件时,速度取决了过滤之后的记录数。两种写法性能基本无差异。

 

 

500W条数据的测试结果

select * from test_a t where id=219 --0.016s
select * from test_a t where name='219' --0.016s
select * from test_a t where code = rpad('100000',20,' ');--0.016s

select * from test_a t where trim(code) = '219' --33.3s
select * from test_a t where substr(code,0,3) = '219'--前15条0.125,0.047s
select count(code) from test_a t where substr(code,0,3) = '219'--12.8s
select * from test_a t where substr(code,0,6) = '100000'--11.579s

 

select count(*) from test_a --46s
select count(id) from test_a --5.28s,4.84s
select count(*) from test_a where id>1000 and id <10000--0.016s
select count(id) from test_a where id>1000 and id <10000 --0.016s

 

对大表进行查询分页时,最好先确定一个查询条件。否则结果集出来的速度会比较慢。因为分页先要计算总记录数。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值