Java教程

SQL优化: 匹配中间字段内容的一种写法

本文主要是介绍SQL优化: 匹配中间字段内容的一种写法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

众所周知,当索引字段使用like时,只有前缀查找才会走索引,但难免有时候需要匹配字符串中间部分内容,如果这个时候,选择字段只有索引字段,会走索引,例如:

例: select tob.object_name from test_objects tob
where tob.object_name like '%EFGHI%';

注: object_name 有索引

SELECT STATEMENT, GOAL = ALL_ROWS			105	2745	107055
 INDEX FAST FULL SCAN	LOTPYTHON	IND_TEST_OBJECTS001	105	2745	107055

但如果选择内容包含非索引字段时,是不会走索引的。

例:select tob.object_name,tob.object_id from test_objects tob
where tob.object_name like '%EFGHI%'

注: object_name 有索引

SELECT STATEMENT, GOAL = ALL_ROWS			307	2745	120780
 TABLE ACCESS FULL	LOTPYTHON	TEST_OBJECTS	307	2745	120780

那有没有好的办法呢,其实还是可以通过某种写法规避的。

例如:with test_like as (select object_name from test_objects 
where object_name like '%EFGHI%'
union all
select '不可能出现的词' as  object_name from dual     
)
select tob.object_name,tob.object_id from test_objects tob
where tob.object_name in (select * from test_like);

SELECT STATEMENT, GOAL = ALL_ROWS			112	1	110
 HASH JOIN			112	1	110
  NESTED LOOPS			112	1	110
   NESTED LOOPS			112	1	110
    STATISTICS COLLECTOR					
     VIEW	SYS	VW_NSO_1	108	2746	181236
      HASH UNIQUE				1	181236
       VIEW	LOTPYTHON		108	2746	181236
        UNION-ALL					
         INDEX FAST FULL SCAN	LOTPYTHON	IND_TEST_OBJECTS001	105	2745	107055
         FAST DUAL			2	1	
    INDEX RANGE SCAN	LOTPYTHON	IND_TEST_OBJECTS001	2	1	
   TABLE ACCESS BY INDEX ROWID	LOTPYTHON	TEST_OBJECTS	3	1	44
  TABLE ACCESS FULL	LOTPYTHON	TEST_OBJECTS	3	1	44

该写法有一个限制条件,就是查询返回的数据量不是很大,当然,数据量返回很大的时候,也不应该走索引。

这篇关于SQL优化: 匹配中间字段内容的一种写法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!