表中将近有1100万数据,很多时候,我们要执行 字符串匹配,在SQL语句中,我们通常运用 like来达到我们搜索的目标。但经过实际测试发觉,like的效率与instr函数差别相当大。下面是一些测试结果:

  SQL> set timing on

  SQL> select count(*) from t where instr(title,’手册’)>0;

  COUNT(*)

  ———-

  65881

  Elapsed: 00:00:11.04

  SQL> select count(*) from t where title like ‘%手册%’;

  COUNT(*)

  ———-

  65881

  Elapsed: 00:00:31.47

  SQL> select count(*) from t where instr(title,’手册’)=0;

  COUNT(*)

  ———-

  11554580

  Elapsed: 00:00:11.31

  SQL> select count(*) from t where title not like ‘%手册%’;

  COUNT(*)

  ———-

  11554580

  注:

  instr(title,’手册’)>0 相当于like

  instr(title,’手册’)=0 相当于not 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 wner='SYSMAN' where owner!='ROBINSON';

已更新50353行。

SQL> update test set wner='SYSTEM' where object_id>1000 and object_id<1020;

已更新19行。

SQL> commit;

提交完成。

SQL> update test set wner='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调优

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/robinson1988/archive/2010/03/23/5408253.aspx

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21916216/viewspace-630315/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21916216/viewspace-630315/

like not like 优化 2相关推荐

  1. 系统遇到并发瓶颈时的优化方向

    1. 设计高质量代码优化Map 使用读写锁,读写锁 读多写少(存储用户连接信息) map不要太大. 2. 突破系统瓶颈 优化连接数 linux下的系统最大连接数 3. 降低对Cpu资源的使用 降低io ...

  2. SVN优化(一) SVN忽略maven项目的target

    SVN优化(一) SVN忽略maven项目的target 一 eclipse刚开始导入的项目: 二  解决办法 方式一: 在项目代码路径,如: F:\xyx\sl  鼠标右键,"Tortoi ...

  3. 如何定位并优化慢查询Sql

    根据慢日志定位慢查询SQL. 查询慢日志相关变量,并进行设置: 主要关注下述三个变量: long_query_time.show_query_log_file.show_query_log 慢查询sq ...

  4. kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势

    陈显铭(山丘) 读完需要 6分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高效 ...

  5. 各种优化算法公式快速回忆优化器-深度学习

    本文是Deep Learning 之 最优化方法系列文章的RMSProp方法.主要参考Deep Learning 一书. 整个优化系列文章列表: Deep Learning 之 最优化方法 Deep ...

  6. Pytorch实现MNIST(附SGD、Adam、AdaBound不同优化器下的训练比较) adabound实现

     学习工具最快的方法就是在使用的过程中学习,也就是在工作中(解决实际问题中)学习.文章结尾处附完整代码. 一.数据准备   在Pytorch中提供了MNIST的数据,因此我们只需要使用Pytorch提 ...

  7. 从 SGD 到 Adam —— 深度学习优化算法概览 各种优化器 重点

    20210701 https://blog.51cto.com/u_15064630/2571266 [机器学习基础]优化算法详解 详细 https://blog.csdn.net/u01338501 ...

  8. 梯度优化算法Adam

    最近读一个代码发现用了一个梯度更新方法, 刚开始还以为是什么奇奇怪怪的梯度下降法, 最后分析一下是用一阶梯度及其二次幂做的梯度更新.网上搜了一下, 果然就是称为Adam的梯度更新算法, 全称是:自适应 ...

  9. pytorch 优化器 机器学习 调参

    torch.optim 如何使用optimizer 构建 为每个参数单独设置选项 进行单次优化 optimizer.step() optimizer.step(closure) 算法 如何调整学习率 ...

  10. 『PyTorch』第十一弹_torch.optim优化器 每层定制参数

    一.简化前馈网络LeNet 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 im ...

最新文章

  1. 小米数据管理与应用实践
  2. 30个非常时尚的网页联系表单设计优秀示例
  3. 利用OpenCV的convexHull和convexityDefects做凸包(凸壳)检测及凸包(凸壳)的缺陷检测
  4. .net Redis缓存优化提高加载速度和服务器性能(一)
  5. layui-简单辅助元素 - 页面元素
  6. signalr收不到服务器的信息,重新连接的客户端SignalR没有收到消息 - javascript
  7. 外网ip有变化发送邮箱vbs版
  8. 一份简短又全面的数学建模技能图谱:常用模型算法总结
  9. SAE J1939学习笔记(一)
  10. IDEA2021 配置 SVN
  11. Unity官网注册账号绑定手机国籍更改失败
  12. Entry name ‘firebase-abt.properties‘ collided
  13. 14宽的键槽深度多少_平键和键槽标准尺寸规格表.doc
  14. 资金合规到底是什么个意思 ?
  15. 链路不通或服务器没响应,连不通服务器服务怎么办(理论篇)
  16. 一些心理上的优势状态和劣势状态
  17. SQL注入测试平台 SQLol -2.SELECT注入测试
  18. C语言如何实现任意数相乘
  19. CSharp 类型转换
  20. 消息称高通骁龙 895 样品性能提升可达 20%

热门文章

  1. 设置和获取中断向量,很清楚嗷
  2. 烟雨江湖小米鸿蒙,烟雨江湖小米时装怎么拿? 小米衣服获取方法详解[多图]
  3. Python 简单元组入门之“简易中文数字对照表”
  4. 关于numpy中的一维行向量、列向量的理解
  5. APICloud的特性
  6. vue使用ajax提交数据,vue中使用ajax请求 data的数据问题
  7. 小程序集成Three.js,使用npm安装gsap动画库
  8. 优衣库46万客户信息遭泄露,这些年,你的信息还被谁泄露过?
  9. 【视觉高级篇】23 # 如何模拟光照让3D场景更逼真?(上)
  10. 2021物理化学实验8:乙酸乙酯皂化反应动力学研究