Oracle中Like与Instr模糊查询性能大比拼

instr(title,'手册')>0 相当于 title like '%手册%'
instr(title,'手册')=1 相当于 title like '手册%'
instr(title,'手册')=0 相当于 title not like '%手册%'  

t表中将近有1100万数据,很多时候,我们要进行字符串匹配,在SQL语句中,我们通常使用like来达到我们搜索的目标。但经过实际测试发现,like的效率与instr函数差别相当大。下面是一些测试结果:

SQL> set timing on
SQL> select count(*) from t where instr(title,'手册')>0;
 COUNT(*)
----------
   65881
Elapsed: 00:00:11.04
SQL> select count(*) from t where title like '%手册%';
 COUNT(*)
----------
   65881
Elapsed: 00:00:31.47
SQL> select count(*) from t where instr(title,'手册')=0;
 COUNT(*)
----------
 11554580
Elapsed: 00:00:11.31
SQL> select count(*) from t where title not like '%手册%';
 COUNT(*)
----------
 11554580 

另外,我在结另外一个2亿多的表,使用8个并行,使用like查询很久都不出来结果,但使用instr,4分钟即完成查找,性能是相当的好。这些小技巧用好,工作效率提高不少。通过上面的测试说明,ORACLE内建的一些函数,是经过相当程度的优化的。

instr(title,'aaa')>0 相当于like
instr(title,'aaa')=0 相当于not like 

特殊用法:

 select  id, name from users where instr('101914, 104703', id) > 0;  

它等价于

select  id, name from users where id = 101914 or id = 104703; 

使用Oracle的instr函数与索引配合提高模糊查询的效率

一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:

select * from tb where name like '%XX%';
select * from tb where instr(name,'XX')>0;  

若是在name字段上没有加索引,两者效率差不多,基本没有区别。

为提高效率,我们在name字段上可以加上非唯一性索引:

create index idx_tb_name on tb(name);  

这样,再使用

select * from tb where instr(name,'XX')>0;  

这样的语句查询,效率可以提高不少,表数据量越大时两者差别越大。但也要顾及到name字段加上索引后DML语句会使索引数据重新排序的影响。

以上所述是小编给大家介绍的Oracle中Like与Instr模糊查询性能大比拼,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • oracle截取字符(substr)检索字符位置(instr)示例介绍

    一:理论 oracle 截取字符(substr),检索字符位置(instr) case when then else end语句使用 收藏 常用函数:substr和instr 1.SUBSTR(string,start_position,[length]) 求子字符串,返回字符串 解释:string 元字符串 start_position 开始位置(从0开始) length 可选项,子字符串的个数 For example: substr("ABCDEFG", 0); //返回:ABCD

  • Oracle中instr函数使用方法

    INSTR (源字符串, 目标字符串, 起始位置, 匹配序号) 在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置.只检索一次,就是说从字符的开始到字符的结尾就结束. 语法如下: instr( string1, string2 [, start_position [, nth_appearance ] ] ) 参数分析: string1 源字符串,要在此字符串中查找. string2 要在string1中查找的字符串. start_position 代表string

  • SQL中Charindex和Oracle中对应的函数Instr对比

    sql :charindex('字符串',字段)>0 charindex('administrator',MUserID)>0 oracle:instr(字段,'字符串',1,1) >0 instr(MUserID,'administrator',1,1)>0 在项目中用到了Oracle中 Instr 这个函数,顺便仔细的再次学习了一下这个知识. Oracle中,可以使用 Instr 函数对某个字符串进行判断,判断其是否含有指定的字符. 其语法为: Instr(string, su

  • oracle使用instr或like方法判断是否包含字符串

    首先想到的就是contains,contains用法如下: select * from students where contains(address, 'beijing') 但是,使用contains谓词有个条件,那就是列要建立索引,也就是说如果上面语句中students表的address列没有建立索引,那么就会报错. 好在我们还有另外一个办法,那就是使用instr,instr的用法如下: select * from students where instr(address, 'beijing

  • Oracle的substr和instr函数简单用法

    Oracle的substr函数简单用法 substr(字符串,截取开始位置,截取长度) //返回截取的字 substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串 substr('Hello World',1,1) //返回结果为 'H'  *0和1都是表示截取的开始位置为第一个字符 substr('Hello World',2,4) //返回结果为 'ello' substr('Hello World',-3,3)//返回结果为

  • oracle正则表达式regexp_like的用法详解

    /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBSTR的功能相似4,REGEXP_REPLACE :与REPLACE的功能相似它们在用法上与Oracle SQL 函数LIKE.INSTR.SUBSTR 和REPLACE 用法相同,但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符.POSIX 正则表达式由标准的元字符(m

  • Oracle中Like与Instr模糊查询性能大比拼

    instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册')=1 相当于 title like '手册%' instr(title,'手册')=0 相当于 title not like '%手册%' t表中将近有1100万数据,很多时候,我们要进行字符串匹配,在SQL语句中,我们通常使用like来达到我们搜索的目标.但经过实际测试发现,like的效率与instr函数差别相当大.下面是一些测试结果: SQL> set timing on

  • 解读Oracle中代替like进行模糊查询的方法instr(更高效)

    目录 一.简介 二.使用说明 对应参数描述 我们以一些示例讲解使用方法 三.instr()与like比较 instr函数也有三种情况 下面通过一个示例说明like 与 instr()的使用比较 四.效率对比 五.总结 一.简介 相信大家都使用过like进行模糊匹配查询,在oracle中,instr()方法可以用来代替like进行模糊查询,大数据量的时候效率更高. 本文将对instr()的基本使用方法进行详解以及通过示例讲解与like的效率对比. 二.使用说明 instr(sourceString

  • sqlserver和oracle中对datetime进行条件查询的一点区别小结

    首先,看一下sql server,之前我们都通过前台用户选择一个起始时间和一个结束时间(以日为最小单位),然后来作为条件进行查询,如果直接通过"between starttime and endtime"来作为条件的话,发现会自动将"2009-06-17"转化为" 2009-06-17 00:00:00",于是如下查询条件" between '2009-06-16' and '2009-06-17'",只能得到16日的数据,1

  • 简介iOS开发中应用SQLite的模糊查询和常用函数

    SQLite模糊查询 一.示例 说明:本文简单示例了SQLite的模糊查询 1.新建一个继承自NSObject的模型 该类中的代码: 复制代码 代码如下: // //  YYPerson.h //  03-模糊查询 // //  Created by apple on 14-7-27. //  Copyright (c) 2014年 wendingding. All rights reserved. // #import <Foundation/Foundation.h> @interface

  • ASP.NET中利用存储过程实现模糊查询

    一.建立存储过程 在MSSQL中的Northwind数据库中为employess表新建存储过程(作用按LastName进行模糊查询): CREATE PROCEDURE Employess_Sel @lastname nvarchar (20)ASselect lastname from Employees where lastname like '%' + @lastname + '%'GO 二.窗体设计 1.新建ASP.NET Web应用程序,命名为WebSql,选择保存路径然后点击确定.

  • oracle中not exists对外层查询的影响详解

    前言 最近同事发现了一个问题,在12c中跑的buffer get很高,但是在10g中跑的buffer很低.怀疑是不是12c的优化器有问题. 这个10g的环境和12c的环境,数据量大致一样,只是有很少部分的不同,但是就是这个很少部分不同,造成了not exists中的子查询返回不同的值,进而对外层查询产生不同的影响. 我们来用如下的代码模拟一下. 初始化数据: --10g drop table t1; drop table t2; create table t1 (id number,name v

  • oracle sql语言模糊查询--通配符like的使用教程详解

    oracle在Where子句中,可以对datetime.char.varchar字段类型的列用Like子句配合通配符选取那些"很像..."的数据记录,以下是可使用的通配符: %   零或者多个字符 _    单一任何字符(下划线) \     特殊字符 oracle10g以上支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,RE

  • Oracle 模糊查询及like用法

    目录 Oracle 模糊查询like用法 一.where子句中使用like关键字 1._ 2.[] 3.[^] 二.在Oracle中提供了instr(strSource,strTarget)函数 Oracle 模糊查询like用法 一.where子句中使用like关键字 我们可以在where子句中使用like关键字来达到Oracle模糊查询的效果:在Where子句中,可以对datetime.char.varchar字段类型的列用Like关键字配合通配符来实现模糊查询, 以下是可使用的通配符: %

  • mongo中模糊查询的综合应用

    前言 以下是一个mongo查询的综合应用,即介绍一个生产中实际应用的模糊查询,当然其实也很简单,主要用到mongo中的模糊查询和$or查询,以及并的关系,下面是一个mongo中的一条记录 { "_id" : "ffe6a068-9043-4334-97d2-75387340e655", "file_id" : "ffe6a068-9043-4334-97d2-75387340e655", "name" :

随机推荐