oracle like模糊查询不能走索引?

这里要纠正一个网上很多教程说的模糊匹配不能走索引的说法,因为在看《收获,不止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%去匹配也是不走索引的

原文地址:https://www.cnblogs.com/mzq123/p/10989254.html

时间: 2024-10-07 03:53:40

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

like模糊查询是否走索引

1.模糊查询,后通配 走索引 ,前通配 走全表 2.where条件用in或or 不会走索引 3.order by 排序时,如果碰到相同的值,则会随机进行排序,排序出来的结果集不是固定的.建议使用id序列进行排序(唯一的值).   原文地址:https://www.cnblogs.com/chenglangpofeng/p/10643387.html

回味Oracle的模糊查询

select table_name,tablespace_name,temporary from user_tables where table_name like '%PROV%' 分析: table_name:表名(varchar2(30)); tablespace_name:存储表名的表空间(varchar2(30)): temporary:是否为临时表(varchar2(1)). 4种通配符的含义 % 表示零个或多个字符 _ 表示单个字符 [] 表示范围[a-f]或集合[abcdef]的

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

最近在写DAO层的时候,遇到一个问题,就是使用like进行模糊查询时,输入下划线,无法精确查到数据,而是返回所有的数据. 这让我很好奇,百度之后才发现,原来是因为有些特殊字符需要进行转义才可以进行查询. 首先理解一下什么是特殊字符. 在ascii码表中,特殊字符的范围如下.即从32~47 58~64 91~96 123~126. 模糊查询时,有两种方法可以进行转换. 1. 使用REGEXP_LIKE方法,这是个使用正则表达式来查询的方法,因此有此字符需要进行转义才能查询,如$ *等,转义符为反斜

mybatis oracle 分页+模糊查询

实现分页的方式有很多,但常用的是通过SQL来显示分页. 下面就来介绍mybatis 来实现Oracle分页的写法:(ps:不同数据库的写法有区别) 一.分页数据: 1 <select id="findPageByCode" parameterType="java.util.Map" resultMap="pageVO"> 2 select * from 3 ( 4 select A.* ,ROWNUM rn 5 from (selec

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

前因: 客户咨询,有一个业务sql(代表经常被执行且重要),全表扫描在系统占用资源很高(通过ash报告查询得到信息) 思路: 1.找到sql_text,sql_id 2.查看执行计划 3.查询sql涉及对象的对象数据量,段大小,行数量,where条件列,是否存在索引,列的选择读情况如何 4.总结,优化整改 1.找到sql_text,sql_id 094cmrxrahdy2 SELECT 8~10个列名称(由于设计用户信息,因此部分信息不再详细说明) FROM Prescription WHERE

oracle 中模糊查询对like的代替insrt()函数 可以做到效率节约一倍以上

昨天在处理一个字符拆分的功能时,用用到了insrt()函数,偶然发现其实特可以代替模糊查询的like,经多次测试可节约效率一倍以上. 代码如下: select distinct(a.deptname) from sys_depart a, gzdb_task b where instr(a.deptname,b.acceptor ) > 0; select distinct(a.deptname) from sys_depart a, gzdb_task b where a.deptname l

oracle like 模糊查询

在一些查询时,可能把握不准需要查询的确切值,比如百度搜索时输入关键字即可查询出相关的结果,这种查询称为模糊查询. 模糊查询使用LIKE关键字通过字符匹配检索出所需要的数据行.字符匹配操作可以使用通配符"%"和"_": %:表示零个或者多个任意字符._:代表一个任意字符. 语法是:LIKE '字符串'[ESCAPE '字符'].匹配的字符串中,ESCAPE后面的"字符"作为转义字符. 通配符表达式 'S%'                  以S开

oracle like模糊查询简单用法

like  用法介绍: 1."_":匹配单个任意字符 select * from bqh3 where name like '_崔'; 2."%":匹配0个或多个任意字符.但有三种情况如下: like %关键字:以关键字开头的记录 like 关键字%:以关键字结尾的记录 like %关键字% :包含以关键字的记录 查询以A开头的全部信息 select * from bqh3 where name like 'A%' 查询第二个字母以A开头的全部信息: select

oracle 模糊查询 (处理jsp页面传过来的条件)

oracle数据模糊查询的语句: SELECT m.MUSICID,m.MUSICNAME,m.MUSICPICTURE,m.MUSICLYRICS,m.MUSICINSTRUCTION FROM MUSIC m where m.musicname like '%见%'; 本来 我是打算通过 实体类(entity),数据访问层(dao),业务逻辑层(biz)封装后 在Action中调用模糊查询的方法  来实现 根据我输入的 关键字 来进行模糊查询. 试了好多SQL都没有用  提示 为 "非正确语