甲骨文认证体系
Vmware认证体系
AWS亚马逊
阿里云认证体系
红帽认证体系
ZStack云计算认证体系
思科认证体系
华为认证体系
CDA数据分析师认证
达梦认证体系
麒麟
定制化课程
上海腾科教育达梦数据库课程干货分享LIKE、REGEXP_LIKE、INSTR的正确打开方式
发布日期:2020-08-26 09:30:30阅读次数:

很多时候我们都需要用到模糊查询,但是在什么场景用什么查询方式才是最适合的呢?百分之八十的人都喜欢用LIKE,语法简单,正则表达式,等等优点。

下面通过几个简单的例子来对比一下,常用的模糊查询。


首先准备两张表

CREATE TABLE TEST1 AS SELECT * FROM SYSOBJECTS;

CREATE TABLE TEST2 AS SELECT * FROM DBA_TABLES WHERE OWNER = 'USER1';


ROUND1:列对列全表扫描

LIKE

SELECT * FROM TEST1 T1,TEST2 T2 

WHERE T1.NAME LIKE '%'||T2.TABLE_NAME||'%' ;

执行耗时:563毫秒    1875行


INSTR

SELECT * FROM TEST1 T1,TEST2 T2 WHERE INSTR(T1.NAME,T2.TABLE_NAME)>0;

执行耗时:338毫秒    1875行

 

REGEXP_LIKE

SELECT * FROM TEST1 T1,TEST2 T2 WHERE REGEXP_LIKE(T1.NAME,T2.TABLE_NAME);

执行耗时:10.740秒   1875行


小结:在进行列列比较时,虽然同是全表扫描,但是LIKEINSTR均可以利用批量处理来进行对比,因此性能明显优于REGEXP_LIKE函数


ROUND2:列对值全表扫描

LIKE

SELECT * FROM TEST1 T1 WHERE T1.NAME LIKE '%A%'; 

执行耗时:16毫秒    1944行


INSTR

SELECT * FROM TEST1 T1 WHERE INSTR(T1.NAME,'A')>0

执行耗时:16

毫秒    1944行

 

REGEXP_LIKE

SELECT * FROM TEST1 T1,TEST2 T2 WHERE REGEXP_LIKE(T1.NAME,'A');

执行耗时:21毫秒    1944行


小结:在进行列值比较时,LIKE、INSTR、REGEXP_LIKE均可以利用批量处理来进行数据对比,但是多次执行后REGEXP_LIKE函数的性能稍差。


ROUND3:功能对比

测试数据和索引


 

INSERT INTO TEST1(NAME) VALUES ('113456');

INSERT INTO TEST1(NAME) VALUES ('123456');

INSERT INTO TEST1(NAME) VALUES ('133456');

INSERT INTO TEST1(NAME) VALUES ('143456');

INSERT INTO TEST1(NAME) VALUES ('1abc56');

COMMIT;

CREATE INDEX IND_TEST1_NAME ON TEST1(NAME);


在前两轮的PK中,REGEXP_LIKE表现差强人意,但是REGEXP_LIKE函数强大的功能,让我们不得不选择它来进行模糊查询。


例1:查询出TEST1表中name列以1开头并以56结尾的数据。


REGEXP_LIKE

SELECT * FROM TEST1 T1 WHERE REGEXP_LIKE(T1.NAME,'1...56')




能查询但是无法利用索引


LIKE

SELECT * FROM TEST1 T1 WHERE T1.NAME LIKE '1___56'



能查询并利用了索引,在大量数据情况下,利用索引的LIKE会占据很大的优势。 


INSTR 

无法满足条件


例2:如果需要查到全部都是数字的列


REGEXP_LIKE



LIKE和INSTR却无能为力了。


不仅如此,使用REGEXP_LIKE还可以通过字符集、是否区分大小写、空格等一系列过滤条件来进行模糊查询。


综上所述:

在无法利用索引的情况下,使用INSTR是最佳的选择;

能利用索引的,只有LIKE

如果条件很苛刻不好过滤判断,那么REGEXP_LIKE就派上用场了。


上海腾科教育科技有限公司聚焦ICT人才培养和教育服务、培养数字化时代的新型ICT人才、促进良性的ICT人才生态发展,提供面授教育、在线教育、IT人才培养与就业、高校专业共建与实验室建设、企业人才定制培养,以及教育科技领域内的技术开发、咨询、服务以及解决方案,专注高校ICT课程课件研发、基于华为公有云的云实验实训平台建设,致力于ICT技术在高等院校的引进、开发和推广,是一家全国性的专业ICT行业技术认证服务公司。

腾科教育是华为授权的培训合作伙伴,专业提供华为ICT技术架构认证、平台与服务认证、行业服务认证等华为职业认证服务,连续多年荣获华为年度最佳合作伙伴贡献奖、华为优秀战略合作伙伴、上海HCIE精英俱乐部伙伴,连续多年举办腾科技术嘉年华华为专场,并协办华为ICT大赛、华为生态伙伴精英赛伙伴赛分赛场、华为人才双选会上海场等活动和赛事,提供面向华为生态合作伙伴和ICT学员的人才供需双选平台及ICT学员就业通道,培养ICT行业所需创新型、融合型人才。