oracle中like的优化

简介: 简单说两句,具体看例子1。尽量不要使用 like '%..%' 2。对于 like '..%..' (不以 % 开头),Oracle可以应用 colunm上的index 3。
简单说两句,具体看例子


1。尽量不要使用 like '%..%'

2。对于 like '..%..' (不以 % 开头),Oracle可以应用 colunm上的index

3。对于 like '%...' 的 (不以 % 结尾),可以利用reverse + function index 的形式,变化成 like '..%'


代码:


-- '建测试表和Index,注意,重点在于带reverse的function index。同时,一定要使用CBO才行……

 

sys@mescp> select reverse('123') from dual;REVERSE('123')

--------------------------------

321

 

1 row selected.

sys@mescp> create table test_like as select object_id,object_name from dba_objects;

Table created.

sys@mescp> create index test_like__name on test_like(object_name);

Index created.

sys@mescp> create index test_like__name_reverse on test_like(reverse(object_name));

Index created.
sys@mescp> analyze table test_like compute statistics for table for all indexes;

Table analyzed.

sys@mescp> set autotrace trace exp

 

 


-- '常量开头的like , 会利用index ,没问题…… '

sys@mescp> select * from test_like where object_name like AS%';


Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655Bytes=15720)

2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME' (NON-UNIQUE) (Cost=2 Card=118)


--'开头和结尾都是 % ,对不起,很难优化'

sys@mescp> select * from test_like where object_name like '%%';


Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720)

1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 ytes=15720)


-- '以常量结束,直接写的时候是不能应用index的'

sys@mescp> select * from test_like where object_name like '%S';

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=6 Card=655 Bytes=15720)

1 0 TABLE ACCESS (FULL) OF 'TEST_LIKE' (Cost=6 Card=655 Bytes=15720)

--'以常量结束的,加个reverse 函数,又可以用上index了'

sys@mescp> select * from test_like where reverse(object_name)like reverse('%AS');

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=655 Bytes=15720)

1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_LIKE' (Cost=2 Card=655 Bytes=15720)

2 1 INDEX (RANGE SCAN) OF 'TEST_LIKE__NAME_REVERSE' (NON-UNIQUE) (Cost=2 Card=118)

 

原文: http://rollingpig.itpub.net/post/81/229801 
相关文章
|
SQL Oracle 关系型数据库
Mybatis中oracle、mysql、db2、sql server的like模糊查询
Mybatis中oracle、mysql、db2、sql server的like模糊查询
415 0
|
Oracle 关系型数据库
|
SQL Oracle 关系型数据库
|
Oracle 关系型数据库 索引
|
SQL Oracle 关系型数据库
ORACLE中Like与Instr模糊查询性能大比拼
ORACLE中Like与Instr模糊查询性能大比拼     instr(title,'手册')>0  相当于  title like '%手册%'   instr(title,'手册')=1  相当于  title like '手册%'   instr(title,'手册')=0  相当于  title not like '%手册%'   t表中将近有1100万数据,很多时候,我们要进行字符串匹配,在SQL语句中,我们通常使用like来达到我们搜索的目标。
1992 0
|
Oracle 关系型数据库
让ORACLE LIKE 时不区分大小写
select * from t_resource_base where xdkm_id = '08975DBC-953B-42DC-AA01-65F168891CEE' and regexp_like(resource_title ,'Un','i'); regexp_like(...
1384 0
|
3月前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
215 64
|
23天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
73 11
|
2月前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。

推荐镜像

更多