这里要纠正一个网上很多教程说的模糊匹配不能走索引的说法,因为在看《收获,不止SQL优化》一书,里面举例说到了,并且自己也跟着例子实践了一下,确实like一些特殊情况也是可以走索引的

例子来自《收获,不止SQL优化》一书,实践准备:

//建表,注意要非空数据
drop table t purge;
create table t as select * from dba_objects where object_id is not null; select * from t; //更新数据并建索引,用来测试
update t set object_id=rownum; update t set object_name='AAALJB' where object_id=8; update t set object_name='LJBAAA' where object_id=10; create index idx_object_name on t(object_name);

用set autotrace on用来打印执行计划,这里注意了,用LJB%去模糊匹配,然后观察执行计划,发现是索引范围扫描INDEX RANGE SCAN 的,因为去匹配LJB开头的数据,索引是可以范围查询并匹配到,所以是能走范围索引扫描的,所以网上的说法是不全面的

SQL> set autotrace on
SQL> select object_id,object_name from t where object_name like 'LJB%'; OBJECT_ID
----------
OBJECT_NAME
-------------------------------------------------------------------------------- 10
LJBAAA 执行计划
----------------------------------------------------------
Plan hash value: 1138138579 -------------------------------------------------------------------------------- --------------- | Id | Operation | Name | Rows | Bytes | Cost (%C PU)| Time | -------------------------------------------------------------------------------- --------------- | 0 | SELECT STATEMENT | | 1 | 79 | 4
(0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 79 | 4
(0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IDX_OBJECT_NAME | 1 | | 3
(0)| 00:00:01 | -------------------------------------------------------------------------------- --------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("OBJECT_NAME" LIKE 'LJB%')
filter("OBJECT_NAME" LIKE 'LJB%') Note
-----
- dynamic sampling used for this statement (level=2) SQL>

上面列举了,能走索引的例子,然后改一下用%LJB去匹配,看看能不能走索引?

SQL> set autotrace on
SQL> select object_id,object_name from t where object_name like '%LJB'; OBJECT_ID
----------
OBJECT_NAME
-------------------------------------------------------------------------------- 8
AAALJB 执行计划
----------------------------------------------------------
Plan hash value: 1601196873 --------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 948 | 288 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| T | 12 | 948 | 288 (1)| 00:00:04 |
-------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter("OBJECT_NAME" IS NOT NULL AND "OBJECT_NAME" LIKE '%LJB') Note
-----
- dynamic sampling used for this statement (level=2) 统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
1032 consistent gets
0 physical reads
0 redo size
503 bytes sent via SQL*Net to client
419 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed SQL>

例子可以看出是全表扫描的,不走索引,因为%LJB这种匹配,索引不能确认唯一性,同样的%LJB%去匹配也是不走索引的

oracle like模糊查询不能走索引?的更多相关文章

  1. like模糊查询是否走索引

    1.模糊查询 后通配 走索引 前通配 走全表 2.where条件用in或or 不会走索引索引的本质是平衡b+数,是为了方便查询的平衡多路查找树 B-Tree相比,B+Tree有以下不同点: 每个节点的 ...

  2. oracle like模糊查询

    简单的方式,使用"%" 和 "_" 字符匹配操作可以使用通配符 "%" 和 "_": %:表示任意个字符,包括零个: _ ...

  3. Oracle 特殊字符模糊查询的方法

    最近在写DAO层的时候,遇到一个问题,就是使用like进行模糊查询时,输入下划线,无法精确查到数据,而是返回所有的数据. 这让我很好奇,百度之后才发现,原来是因为有些特殊字符需要进行转义才可以进行查询 ...

  4. 支持Oracle的模糊查询和精准查询

    相信所有的软件开发者都做过页面上的查询功能,而且很多都需要既支持模糊查询的,也需要支持精准查询的,而且不需要增加多余的功能,只需要在文本框中输入包含类似*之类的符号即可. 下面的方法就是通过*来判断到 ...

  5. sql查询未走索引问题分析之查询数据量过大

    前因: 客户咨询,有一个业务sql(代表经常被执行且重要),全表扫描在系统占用资源很高(通过ash报告查询得到信息) 思路: 1.找到sql_text,sql_id 2.查看执行计划 3.查询sql涉 ...

  6. mysql left join查询没走索引

    SELECT t0.ID as id, t0.`NAME` as name, t0.PHONE as phone, t0.`CITY_CODE` as cityCode, t0.SHOOTING_TI ...

  7. Mybatis——oracle 的模糊查询 和 日期处理

    第一种 1 <if test="AGTNAM !=null and AGTNAM !=''"> <![CDATA[and AGTNAM like concat(c ...

  8. oracle like模糊查询简单用法

    like  用法介绍: 1.“_”:匹配单个任意字符 select * from bqh3 where name like '_崔'; 2.“%”:匹配0个或多个任意字符.但有三种情况如下: like ...

  9. 让mysql查询强制走索引

    select * from slot_value_temp force index(idx_slot_type_id) WHERE slot_type_id = 'xxxxxx'; 不定期更新

随机推荐

  1. MongoDB for OPS 03:分片 shard 集群

    写在前面的话 上一节的复制集也就是主从能够解决我们高可用和数据安全性问题,但是无法解决我们的性能瓶颈问题.所以针对性能瓶颈,我们需要采用分布式架构,也就是分片集群,sharding cluster! ...

  2. asp.net core web api 生成 swagger 文档

    asp.net core web api 生成 swagger 文档 Intro 在前后端分离的开发模式下,文档就显得比较重要,哪个接口要传哪些参数,如果一两个接口还好,口头上直接沟通好就可以了,如果 ...

  3. Spring Boot 2.X整合Spring-cache,让你的网站速度飞起来

    计算机领域有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个中间层来解决”,今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来. 本文目录 一.Spring Ca ...

  4. json字符串转为php数组,使用随机字符串生成订单号(学生笔记)

    //提交订单 function add_order(){ session_start(); // var_dump($_SESSION); // die(); // session_destroy() ...

  5. python数据挖掘之数据探索第一篇

    目录 数据质量分析   当我们得到数据后,接下来就是要考虑样本数据集的数据和质量是否满足建模的要求?是否出现不想要的数据?能不能直接看出一些规律或趋势?每个因素之间的关系是什么?   通过检验数据集的 ...

  6. windows 下使用cmake指定visual studio 版本

    https://blog.csdn.net/iceboy314159/article/details/87829950

  7. 移动端适配方案(rem+flex)

    为什么用rem不用px? 主流:各大网站的移动版绝大多数都是用的rem.   移动端屏幕分辨率差别太大:最低适配的iPhone6,分辨率仅为750*1334.而现在市面上大多数手机,都达到了1080* ...

  8. 同样是高并发,QQ/微博/12306的架构难度一样吗?

    开篇 同一个用户并发扣款时,有一定概率出现数据不一致,可以使用CAS乐观锁的方式,在不降低吞吐量,保证数据的一致性: UPDATE t_yue SET money=$new_money WHERE u ...

  9. [20191013]oracle number类型存储转化脚本.txt

    [20191013]oracle number类型存储转化脚本.txt --//测试看看是否可以利用bc obase=100的输出解决问题.另外以前脚本忘记考虑尾数的四舍五入问题.--//也许编程就是 ...

  10. [PHP] vscode配置SFTP扩展同步文件

    在我们的项目开发过程中,经常有一种模式,有一台linux的开发机作为我们的测试机器,上面安装了ftp服务.我们在windows系统的本地机器使用IDE编写代码,自动或者保存时同步上传到测试机下,这样就 ...