很多时候我们都需要用到模糊查询,但是在什么场景用什么查询方式才是最适合的呢?百分之八十的人都喜欢用 LIKE,语法简单,正则表达式,等等优点。
下面通过几个简单的例子来对比一下,常用的模糊查询。
CREATE TABLE TEST1 AS SELECT * FROM SYSOBJECTS;
CREATE TABLE TEST2 AS SELECT * FROM DBA_TABLES WHERE OWNER = 'USER1';
SELECT * FROM TEST1 T1,TEST2 T2
WHERE T1.NAME LIKE '%'||T2.TABLE_NAME||'%' ;
执行耗时:563 毫秒 1875 行
SELECT * FROM TEST1 T1,TEST2 T2 WHERE INSTR(T1.NAME,T2.TABLE_NAME)>0;
执行耗时:338 毫秒 1875 行
SELECT * FROM TEST1 T1,TEST2 T2 WHERE REGEXP_LIKE(T1.NAME,T2.TABLE_NAME);
执行耗时:10.740 秒 1875 行
小结:在进行列列比较时,虽然同是全表扫描,但是 LIKE 和 INSTR 均可以利用批量处理来进行对比,因此性能明显优于 REGEXP_LIKE 函数。
SELECT * FROM TEST1 T1 WHERE T1.NAME LIKE '%A%';
执行耗时:16 毫秒 1944 行
SELECT * FROM TEST1 T1 WHERE INSTR(T1.NAME,'A')>0;
执行耗时:16 毫秒 1944 行
SELECT * FROM TEST1 T1,TEST2 T2 WHERE REGEXP_LIKE(T1.NAME,'A');
执行耗时:21毫秒 1944行
小结:在进行列值比较时,LIKE、INSTR、REGEXP_LIKE 均可以利用批量处理来进行数据对比,但是多次执行后 REGEXP_LIKE 函数的性能稍差。
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 函数强大的功能,让我们不得不选择它来进行模糊查询。
SELECT * FROM TEST1 T1 WHERE REGEXP_LIKE(T1.NAME,'1...56')
能查询但是无法利用索引。
SELECT * FROM TEST1 T1 WHERE T1.NAME LIKE '1___56';
能查询并利用了索引,在大量数据情况下,利用索引的 LIKE 会占据很大的优势。
无法满足条件。
LIKE 和 INSTR 却无能为力了。
不仅如此,使用 REGEXP_LIKE 还可以通过字符集、是否区分大小写、空格等一系列过滤条件来进行模糊查询。
综上所述:
文章
阅读量
获赞