博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle中like的优化
阅读量:7024 次
发布时间:2019-06-28

本文共 2142 字,大约阅读时间需要 7 分钟。

简单说两句,具体看例子

1。尽量不要使用 like '%..%'
2。对于 like '..%..' (不以 % 开头),Oracle可以应用 colunm上的index
3。对于 like '%...' 的 (不以 % 结尾),可以利用reverse + function index 的形式,变化成 like '..%'
代码:
-- '建测试表和Index,注意,重点在于带reverse的function index。同时,一定要使用CBO才行……
 
> select reverse('123') from dual;REVERSE('123')
--------------------------------
321
 
1 row selected.
> create table test_like as select object_id,object_name from dba_objects;
Table created.
> create index test_like__name on test_like(object_name);
Index created.
> create index test_like__name_reverse on test_like(reverse(object_name));
Index created.
> analyze table test_like compute statistics for table for all indexes;
Table analyzed.
> set autotrace trace exp
 
 
-- '常量开头的like , 会利用index ,没问题…… '
> 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)
--'开头和结尾都是 % ,对不起,很难优化'
> 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的'
> 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了'
> 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)
本文转自 牛海彬 51CTO博客,原文链接:http://blog.51cto.com/newhappy/76994,如需转载请自行联系原作者
你可能感兴趣的文章
相对和绝对路径、CD、mkdir、rm、PATH环境变量、cp
查看>>
4.10/4.11/4.12 lvm讲解 4.13 磁盘故障小案例
查看>>
运维人员日常工作(转自老男孩)
查看>>
Deepin-linux通过openssh连接阿里云远程服务器
查看>>
Codeiginter数据库操作
查看>>
CentOS下OpenJDK设置JAVA_HOME
查看>>
正向代理和反向代理的区别
查看>>
算法和自动调试
查看>>
Cisco ISE1.4升级到2.2的那点事儿……
查看>>
JAVA中使用动态链接库 须知
查看>>
祭二大爷
查看>>
游戏任务系统
查看>>
Idea和tomcat内存设置
查看>>
33款可用来抓数据的开源爬虫软件工具
查看>>
IO流(三)_File类_字节流与字符流
查看>>
安全测试常用功能点
查看>>
varnish3.0清除缓存
查看>>
Bitnami-Redmine外网访问phpmyadmin设置
查看>>
详细介绍Linux硬盘挂载步骤(一)
查看>>
RMAN中catalog和nocatalog区别
查看>>