SQL 语句中对于like 的调优
SQL> create table test as select * from dba_objects;
表已创建。
SQL> select owner,object_name from test where owner like 'ROBINSON%';
OWNER OBJECT_NAME
------------------------------------------------------------ ------------------------------
ROBINSON TEST
ROBINSON T2
ROBINSON T1
ROBINSON T3
ROBINSON T4
ROBINSON HEX_TO_BIN
已选择6行。
SQL> create index i_owner on test(owner);
索引已创建。
SQL> update test set owner='SYSMAN' where owner!='ROBINSON';
已更新50353行。
SQL> update test set owner='SYSTEM' where object_id>1000 and object_id<1020;
已更新19行。
SQL> commit;
提交完成。
SQL> update test set owner='SCOTT' where object_id>2000 and object_id<2005;
已更新4行。
SQL> select distinct owner from test;
OWNER
------------------------------------------------------------
ROBINSON
SYSTEM
SCOTT
SYS
SQL> BEGIN
2 DBMS_STATS.GATHER_TABLE_STATS(ownname => 'ROBINSON',
3 tabname => 'TEST',
4 estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
5 method_opt => 'for all columns size repeat',
6 degree => DBMS_STATS.AUTO_DEGREE,
7 cascade=>TRUE
8 );
9 END;
10 /
PL/SQL 过程已成功完成。
SQL> set autot traceonly
SQL> select owner,object_name from test where owner not like 'SYS%';
已选择10行。
执行计划
----------------------------------------------------------
Plan hash value: 1357081020
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 25180 | 737K| 142 (3)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| TEST | 25180 | 737K| 142 (3)| 00:00:02 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("OWNER" NOT LIKE 'SYS%')
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
0 bytes sent via SQL*Net to client
0 bytes received via SQL*Net from client
0 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
10 rows processed
从此处可以看到选择了10行,但是却走了全表扫描,现在对其加HINT提示
SQL> select /*+ INDEX (test I_OWNER) */ owner,object_name from test where owner not like 'SYS%';
已选择10行。
执行计划
----------------------------------------------------------
Plan hash value: 469605390
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 25180 | 737K| 490 (1)| 00:00:06 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 25180 | 737K| 490 (1)| 00:00:06 |
|* 2 | INDEX FULL SCAN | I_OWNER | 25180 | | 140 (3)| 00:00:02 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("OWNER" NOT LIKE 'SYS%')
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
0 bytes sent via SQL*Net to client
0 bytes received via SQL*Net from client
0 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
10 rows processed
我们发现,强制加HINT提示所花的成本比全表扫描成本更高,这里要想优化这条SQL 必须改like
SQL> drop index i_owner;
索引已删除。
SQL> create index f_owner on test(instr(owner,'SYS',1,1)) ;
索引已创建。
SQL> select owner,object_name from test where instr(owner,'SYS',1,1)=0;
已选择10行。
执行计划
----------------------------------------------------------
Plan hash value: 535182827
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 504 | 15120 | 52 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 504 | 15120 | 52 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | F_OWNER | 201 | | 49 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access(INSTR("OWNER",'SYS',1,1)=0)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
0 bytes sent via SQL*Net to client
0 bytes received via SQL*Net from client
0 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
10 rows processed
当使用函数索引后,COST由原来的142下降到现在的52
总结:对于LIKE语句,我们可以使用instr函数来进行SQL调优
转载于:https://www.cnblogs.com/hehe520/archive/2010/03/23/6330603.html
SQL 语句中对于like 的调优相关推荐
- groovy怎样从sql语句中截取表名_sql注入mysql篇
SQL注入 __0x01 ♛Sql注入原理 Sql注入顾名思义是没有对用户输入的参数进行过滤导致测试者可以将一段非正常语句插入到查询语句中,由web应用带入到数据库中执行,从而读取数据库中的数据. _ ...
- Sql语句中的DDL、DML、DCL的介绍
一.DDL DDL is Data Definition Language statements. Some examples:数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言 1.C ...
- Sql语句中between与in的用法详解
通常在写SQL语句中我们时不时就会用到between或者in,或者两者组合在一起,between的运算符用于 WHERE 表达式中,选取介于两个值之间的数据范围.BETWEEN 同AND 一起搭配使用 ...
- sql语句中left join和inner join中的on与where的区别分析
原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...
- oracle修改表结构的sql命令是什么,sql语句中修改表结构的命令是什么?
sql语句中修改表结构的命令是:"ALTER TABLE"命令. ALTER TABLE 语句用于在已有的表中添加.删除或修改列. SQL ALTER TABLE 语法 如需在表中 ...
- Sql 语句中 IN 和 EXISTS
原文链接: (2条消息)Sql 语句中 IN 和 EXISTS 的区别及应用 - jcpp9527的博客 - CSDN博客 https://blog.csdn.net/wqc19920906/art ...
- SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别
原文:SQL点滴31-SQL语句中@@IDENTITY和@@ROWCOUNT区别 SQL语句中@@IDENTITY和@@ROWCOUNT区别 在一条 INSERT.SELECT INTO 或大容量复制 ...
- SQL语句中between and 范围
2019独角兽企业重金招聘Python工程师标准>>> 经过验证 SQL语句中的between 范围1 and 范伟2 语句是包括的范围1和范围2的 SQL> create ...
- oracle 哦【的【,清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦
清晰讲解SQL语句中的外连接,通用于Mysql和Oracle,全是干货哦 直入主题: 我们做一个操作,将员工SCOTT的部门去掉,再次通过内连接查看数据,看看会产生什么现象? 使用内连接,查询数据 问 ...
最新文章
- 阿里云 Linux指令入门-文件与权限
- hbase 客户端_HBase架构与原理详解
- 从前端界面开发谈微信小程序体验
- Dubbo将积极适配Spring Cloud生态,Spring Cloud体系或将成为微服务的不二选择!
- 【计算理论】计算复杂性 ( NP 类不同表述 | 团问题 | P 对 NP 问题 )
- 判断远程图片是否存在的JavaScript代码
- ubuntu16.04设置ssh免密码登录
- 作者:季统凯,男,博士,中国科学院云计算中心主任、研究员,国云科技股份有限公司董事长,中国云计算专家委员会委员。...
- MountFlags of reg
- CCF201604-1 折点计数
- 算法学习之路|程序运行时间
- 思科室外AP无法注册到WLC
- 第二季-专题19-移植tftp客户端
- SSIS常用的包—通用的属性
- 【直播】陈安东,马琦钧:赛题Baseline讲解以及语音识别基础知识介绍
- 如何清理多余的Windows桌面右键菜单
- 怎样写好求职简历(STAR法则)
- 计算机cmd如何设置路由,Windows 系统cmd设置添加静态路由方式
- unreal-教程-第十章:蒙太奇实现拔剑动作
- iOS在image上画文字-画图片