文档章节

ORACLE中Like与Instr模糊查询性能大比拼(转载)

Zhang_Java
 Zhang_Java
发布于 2016/09/23 14:07
字数 611
阅读 26
收藏 0

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字段进行模糊查询会采用下面两种方式: 1.select * from tb where name like '%XX%'; 2.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语句会使索引数据重新排序的影响。

© 著作权归作者所有

Zhang_Java
粉丝 5
博文 39
码字总数 32627
作品 0
浦东
程序员
私信 提问
ORACLE中Like与Instr模糊查询性能大比拼

instr(title,'手册')>0 相当于 title like '%手册%' instr(title,'手册')=1 相当于 title like '手册%' instr(title,'手册')=0 相当于 title not like '%手册%' t表中将近有1100万数据,很多......

lin_647
2014/01/09
0
0
Oracle正则 转载

1. REGEXP_SUBSTR REGEXPSUBSTR 函数使用正则表达式来指定返回串的起点和终点,返回与sourcestring 字符集中的VARCHAR2 或CLOB 数据相同的字符串。 语法: --1.REGEXP_SUBSTR与SUBSTR函数相同...

葬心
2014/06/06
101
1
oracle 统计语句 与常见函数的归纳(未完待续)

一、统计语句 1. count count(*)与count(0)语句的区别: count(*)统计所有数量 count(0)统计第一列不为空的 2. 两个统计量的减法 select(select count() from defect)-(select count() from ...

橘子红了呐
2017/11/14
0
0
Oracle中INSTR函数和SUBSTR函数

1、INSTR函数 语法: instr( string1, string2 [, start_position [, nth_appearance ] ] ) 参数: string1:源字符串,要在此字符串中查找。 string2:要在string1中查找的字符串. start_p...

科技小能手
2017/11/12
0
0
oracle自带的一些基本的常用的函数

1.TO_DATE(字符串,日期格式) oracle自带函数 将字符串转化成日期处理 直接传入的util.date会,有可能与数据库的sql.date不匹配而报错 例如:SELECT TO_DATE('2008-8-8','yyyy-MM-dd') FROM ......

maskleo
2015/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ubuntu或ubuntu kylin优麒麟中安装QQ、wechat微信、百度网盘

从中国国内的地址下载deepin wine,码云上的。这样网速比较快。然后,按照说明向下安装。 https://gitee.com/wszqkzqk/deepin-wine-for-ubuntu...

gugudu
12分钟前
0
0
基于redis分布式锁实现“秒杀”

最近在项目中遇到了类似“秒杀”的业务场景,在本篇博客中,我将用一个非常简单的demo,阐述实现所谓“秒杀”的基本思路。 业务场景 所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源...

别打我会飞
31分钟前
8
0
Zookeeper的实践指南

本章重点 1.数据存储2.基于Java API初探Zookeeper的使用3.深入分析Watcher机制的实现原理4.Curator客户端的使用,简单高效 数据存储 事务日志快照日志运行时日志 bin/zookeepe...

须臾之余
35分钟前
1
0
MySQL mybatis Point类型数据

MySQL中的point用于表示GIS中的地理坐标,在GIS中广泛使用 如何写入mysql,如下图: CREATE TABLE `test-point` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序号', `point` ......

张欢19933
46分钟前
2
0
设计模式-适配器模式

适配器模式 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入...

HOT_POT
今天
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部