admin 管理员组

文章数量: 1184232


2024年3月20日发(作者:php mysql项目)

instr和like的效率比较

测试环境 oracle10g,

tcurrentbilllog

表总数有近200万条

instr(‘源字符串’,’查询字符串’)>0 相当于 ‘源字符串’ like ’%查询字符串%’ =true

instr(‘源字符串’,’查询字符串’)=0 相当于 ‘源字符串’ like ’%查询字符串%’ =false

1.%a%方式:

select * from pub_yh_bm t where instr(_bmdm,'2')>0

等份于:

select * from pub_yh_bm t where _bmdm like '%2%'

2.%a方式:

select * from pub_yh_bm t

where instr(_bmdm,'110101')=length(_bmdm)-length('110101')+1

等份于:

select * from pub_yh_bm t where _bmdm like '%110101'

3.a%方式:

select * from pub_yh_bm t where instr(_bmdm,'11010101')=1

等份于:

select * from pub_yh_bm t where _bmdm like '11010101%'

 全表查询

select * from tcurrentbilllog t where instr(no,'0301')>0;

用时:0.188秒

解释计划

SELECT STATEMENT, GOAL = ALL_ROWS 耗费=4187 基数=30833 字节=6659928

TABLE ACCESS FULL 对象所有者=ICD 对象名称=TCURRENTBILLLOG 耗费=4187 基数=30833

节=6659928

select * from tcurrentbilllog t where no like '%0301%';

用时:0.266秒

解释计划

SELECT STATEMENT, GOAL = ALL_ROWS 耗费=4182 基数=30833 字节=6659928

TABLE ACCESS FULL 对象所有者=ICD 对象名称=TCURRENTBILLLOG 耗费=4182 基数=30833

节=6659928

结果:instr查询用时少,但解释计划中耗费高一些。

 集合查询

select count(*) from tcurrentbilllog t where instr(no,'0301')>0;

用时:3.765秒

解释计划:

SELECT STATEMENT, GOAL = ALL_ROWS 耗费=4183 基数=1 字节=12

SORT AGGREGATE 基数=1 字节=12

TABLE ACCESS FULL

字节=369996

对象所有者=ICD 对象名称=TCURRENTBILLLOG 耗费=4183 基数=30833

select count(*) from tcurrentbilllog t where no like '%0301%';

用时:4.157秒

解释计划:

SELECT STATEMENT, GOAL = ALL_ROWS

SORT AGGREGATE

字节=369996

耗费=4178 基数=1 字节=12

基数=1 字节=12

对象名称=TCURRENTBILLLOG 耗费=4178 基数=30833 TABLE ACCESS FULL 对象所有者=ICD

结果:instr查询用时少,但解释计划中开销要高一些。

like有时可以用到索引,例如:name like '李%'

而当下面的情况时索引会失效:name like '%李'

简单测试来看,instr的效率是比like要高些(orace对内建函数做了优化),而且使用like时,一些

索引是不能用的,但oracle支持函数索引,如果使用函数索引的话,执行更快。

一般的数据库中,instr和like的效率是没有多大差别的,但对于oracle数据库可以通过函数索引来提

高instr的执行效率。


本文标签: 查询 函数 字符串 耗费 基数