instr和like的效率(oracle)

本文通过实际测试比较了Oracle数据库中Instr与Like操作符的性能差异,并探讨了使用函数索引提升Instr查询效率的方法。

instr和like的效率比较

测试环境 oracle10g,tcurrentbilllog表总数有近200万条

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

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

1.%a%方式:
select * from pub_yh_bm t where instr(t.chr_bmdm,'2')>0
等份于:
select * from pub_yh_bm t where t.chr_bmdm like '%2%'

2.%a方式:
select * from pub_yh_bm t
where instr(t.chr_bmdm,'110101')=length(t.chr_bmdm)-length('110101')+1
等份于:
select * from pub_yh_bm t where t.chr_bmdm like '%110101'

3.a%方式:
select * from pub_yh_bm t where instr(t.chr_bmdm,'11010101')=1
等份于:
select * from pub_yh_bm t where t.chr_bmdm like '11010101%'

 

l  全表查询

select * from tcurrentbilllog t whereinstr(t.callerno,'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 t.callerno like
'%0301%';

用时:0.266

解释计划

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

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

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

 

l  集合查询

select count(*) fromtcurrentbilllog t where instr(t.callerno,'0301')>0;
用时:3.765

解释计划:

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

 SORT AGGREGATE                  基数=1   字节=12

  TABLE ACCESS FULL    对象所有者=ICD     对象名称=TCURRENTBILLLOG    耗费=4183 基数=30833    字节=369996

select count(*) fromtcurrentbilllog t where t.callerno like '%0301%';

用时:4.157

解释计划:

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

 SORT AGGREGATE                  基数=1   字节=12

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

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

 

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

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

 

简单测试来看,instr的效率是比like要高些(orace对内建函数做了优化),而且使用like时,一些索引是不能用的,但oracle支持函数索引,如果使用函数索引的话,执行更快。

 

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

Oracle数据库中,`INSTR`函数与`LIKE`操作符均可用于字符串的匹配操作,但在性能效率方面,两者存在显著差异,具体取决于使用场景。 ### `INSTR`函数的特性与性能 `INSTR`函数用于查找一个字符串在另一个字符串中的位置。例如,`INSTR('hello world', 'world')`将返回`7`,表示子字符串`'world'`在主字符串`'hello world'`中从第7个字符开始出现。由于`INSTR`函数返回的是位置信息,因此在仅需判断子字符串是否存在时,通常会结合`CASE`语句或`DECODE`函数使用,以转换为布尔值。相较于`LIKE`操作符,`INSTR`函数在某些情况下能够提供更好的性能,尤其是在处理大量数据时,因为`INSTR`可以直接利用索引进行快速定位,而无需扫描整个表[^1]。 ### `LIKE`操作符的特性与性能 `LIKE`操作符则用于模式匹配,支持通配符`%`(匹配任意数量的字符)`_`(匹配单个字符)。例如,`'hello world' LIKE 'hello%'`将返回`TRUE`,表示字符串以`'hello'`开头。`LIKE`操作符的优点在于其灵活性,特别是在需要进行模糊匹配时。然而,当`LIKE`操作符以通配符开头(如`'%hello'`)时,它将无法有效利用索引,导致性能下降[^1]。 ### 性能对比总结 总体而言,`INSTR`函数在确定性匹配(即查找确切的子字符串)场景下表现更优,尤其是当目标列上有索引时。相反,`LIKE`操作符在需要使用通配符进行模糊匹配时更为灵活,但可能会牺牲一定的性能。 ### 示例代码 以下是一个简单的SQL查询示例,展示了如何使用`INSTR`函数`LIKE`操作符进行字符串匹配: ```sql -- 使用 INSTR 函数 SELECT * FROM employees WHERE INSTR(employee_name, 'John') > 0; -- 使用 LIKE 操作符 SELECT * FROM employees WHERE employee_name LIKE '%John%'; ``` ### 性能优化建议 - **索引优化**:对于经常需要进行字符串匹配的列,创建合适的索引可以显著提高查询性能。特别是对于`INSTR`函数,合理的索引设计可以极大提升效率。 - **避免前导通配符**:在使用`LIKE`操作符时,尽量避免使用前导通配符(如`'%value'`),因为这会导致全表扫描,影响性能。 - **考虑使用全文搜索**:对于复杂的文本搜索需求,考虑使用Oracle的全文搜索功能,这可以提供更高效的搜索机制。 综上所述,选择`INSTR`函数还是`LIKE`操作符应基于具体的查询需求数据特性。在实际应用中,建议通过执行计划分析性能测试来决定最优方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值