在没有创建数据直方图之前,查询优化器是cbo,可能不会选择代价最低(效率最高)的方式查询.

先创建表

--日语假名表
CREATE TABLE JAPANESE_SOUNDMARK
(
ID INTEGER PRIMARY KEY,
ROMAJI VARCHAR2(10),
PHONETIC_SYMBOL VARCHAR(20)
);

创建序列

--创建自增长的序列,用于主键
CREATE SEQUENCE SEQ_JAPANESE_SOUNDMARK
START WITH 1
NOMAXVALUE
INCREMENT BY 1
NOCYCLE
CACHE 10;

创建反向键索引

--给需要模糊查询的列加上反向键索引
CREATE INDEX ROMAJI_REVERSE_INDEX ON JAPANESE_SOUNDMARK(ROMAJI) REVERSE;

创建普通索引

--普通索引
CREATE INDEX PHONETIC_SYMBOL_INDEX ON JAPANESE_SOUNDMARK(PHONETIC_SYMBOL);

注意:

以上语句均为DDL(Data Definition Language)语句,会自动提交事务,如果之前有DML(Data Manipulation Language)语句运行了,但没提交事务,会将之前所有的DML语句也提交事务,ROLLBACK会失效.

1.没有索引时(实际上不需要测试)

--模糊查询,等值
EXPLAIN PLAN FOR
SELECT * FROM JAPANESE_SOUNDMARK
WHERE PHONETIC_SYMBOL LIKE 'A';
--查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

运行结果:

显而易见:全表扫描

这个其实不需要测试,因为没有索引只能走全表扫描,所以,like '%字符串'和like'字符串%'都是全表扫描.

2.不使用通配符,hint使用普通索引

--模糊查询,等值
EXPLAIN PLAN FOR
SELECT /*+ INDEX_RS(JAPANESE_SOUNDMARK PHONETIC_SYMBOL_INDEX) */ * FROM JAPANESE_SOUNDMARK
WHERE PHONETIC_SYMBOL LIKE 'A';
--查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

结果:

Index Range Scan

3.使用通配符后缀,hint使用普通索引

--模糊查询,以...开头
EXPLAIN PLAN FOR
SELECT /*+ INDEX_RS(JAPANESE_SOUNDMARK PHONETIC_SYMBOL_INDEX) */ * FROM JAPANESE_SOUNDMARK
WHERE PHONETIC_SYMBOL LIKE 'A%';
--查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

结果:

同样是:

Index Range Scan

4.使用通配符前缀,hint使用普通索引

--模糊查询,以...结尾
EXPLAIN PLAN FOR
SELECT /*+ INDEX_RS(JAPANESE_SOUNDMARK PHONETIC_SYMBOL_INDEX) */ * FROM JAPANESE_SOUNDMARK
WHERE PHONETIC_SYMBOL LIKE '%A';
--查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

结果:

Index Full Scan

5.不使用通配符,hint使用反向键索引

--模糊查询,等值
EXPLAIN PLAN FOR
SELECT /*+ INDEX_RS(JAPANESE_SOUNDMARK ROMAJI_REVERSE_INDEX) */ * FROM JAPANESE_SOUNDMARK
WHERE ROMAJI LIKE 'A';
--查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

结果:

Index Range Scan

6.使用通配符后缀,hint使用反向键索引

--模糊查询,以...开头
EXPLAIN PLAN FOR
SELECT /*+ INDEX_RS(JAPANESE_SOUNDMARK ROMAJI_REVERSE_INDEX) */ * FROM JAPANESE_SOUNDMARK
WHERE ROMAJI LIKE 'A%';
--查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)

结果:

Index Full Scan

7.使用通配符前缀,hint使用反向键索引

--模糊查询,以...结尾
EXPLAIN PLAN FOR
SELECT /*+ INDEX_RS(JAPANESE_SOUNDMARK ROMAJI_REVERSE_INDEX) */ * FROM JAPANESE_SOUNDMARK
WHERE ROMAJI LIKE '%A';
--查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

结果:

Index Full Scan

结论:

使用普通索引在使用通配符后缀时,只能走Index Range Scan,

而使用反向键索引在使用通配符后缀时,只能走Index Full Scan,

其他情况,两种索引的索引使用方式相同.

一般来说,Index Range Scan效率要高于Index Full Scan,所以,使用普通索引来优化模糊查询就行了.

全模糊查询:

1.使用普通索引时

--全模糊查询
EXPLAIN PLAN FOR
SELECT /*+ INDEX_RS(JAPANESE_SOUNDMARK PHONETIC_SYMBOL_INDEX) */ * FROM JAPANESE_SOUNDMARK
WHERE PHONETIC_SYMBOL LIKE '%A%';
--查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

结果:

Index Full Scan

但是,它有另外一种等价写法:

--全模糊查询
EXPLAIN PLAN FOR
SELECT /*+ INDEX_RS(JAPANESE_SOUNDMARK PHONETIC_SYMBOL_INDEX) */ * FROM JAPANESE_SOUNDMARK
WHERE PHONETIC_SYMBOL LIKE '%A'
AND PHONETIC_SYMBOL LIKE 'A%';
--查看执行计划
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

结果:

Index Range Scan

oracle数据库使用hint来让模糊查询走索引的更多相关文章

  1. 【MySQL 原理分析】之 Explain & Trace 深入分析全模糊查询走索引的原理

    一.背景 今天,交流群有一位同学提出了一个问题.看下图: 之后,这位同学确实也发了一个全模糊查询走索引的例子: 到这我们可以发现,这两个sql最大的区别是:一个是查询全字段(select *),而一个 ...

  2. Oracle数据库,忽略大小写Like模糊查询(SQL Server,MySql原理相同)

    背景 在使用Oracle或者其它数据库时,使用like 关键字进行模糊查询是大家经常使用的功能,在纯中文环境中使用非常好用,还有一些通配符可以使用,但是在纯英文环境中,会出现大小需要精确匹配的问题,主 ...

  3. Oracle 数据库中在使用中文模糊查询时输入中文查询不到结果的解决方法

    添加环境变量 变量名:NLS_LANG 变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK

  4. oracle SQL语句练习MERGE、模糊查询、排序、

    Oracle支持的SQL指令可分为数据操作语言语句.数据定义语言语句.事务控制语句.会话控制语句等几种类型:1.数据操作语言语句数据操作语言语句(Data manipulation language, ...

  5. Oracle数据库中有关记录个数的查询

    一.查询表中全部的记录个数 可用两种方法,一种是在oracle的系统表中统计,另一种需要写存储过程统计,方法分别如下. 1.系统表中统计: SELECT sum(num_rows) FROM user ...

  6. Oracle 表分组 group by和模糊查询like

    分组group by写法 select 字段名 from 表名 group by 字段名 查询这个字段名里的种类分组后可以加聚合函数select 字段名,聚合函数 from 表名 group by 字 ...

  7. Oracle数据库几种启动方式及查询当前状态

    Oracle数据库几种启动方式 1.startup nomount: 非安装启动,这种方式下启动可执行:重建控制文件.重建数据库,读取init.ora文件,启动instance,即启动SGA和后台进程 ...

  8. Oracle中查询走索引的情况

    1.对返回的行无任何限定条件,即没有where子句 2.未对数据表与任何索引主列相对应的行限定条件例如:在City-State-Zip列创建了三列复合索引,那么仅对State列限定条件不能使用这个索引 ...

  9. Oracle数据库对象(表空间/同义词/序列/视图/索引)

    数据库对象 Oracle数据库对象: 数据库对象是数据库的组成部分,常常用 CREATE 命令进行创建,可以使用 ALTER 命令修改,用 DROP 执行删除操作. 种类: (1)表空间:所有的数据对 ...

随机推荐

  1. asp.net Identity2 角色(Role)的使用(一)初始配置

    asp.net Identity自带有角色功能,但默认的模板并没有启用.启用Role的步骤如下:定义role模型--配置角色管理器---配置初始化器---修改数据库上下对象---在应用程序启动文件中配 ...

  2. 09年OA系统集成商资料(转载)

    [转载]哪个OA比较好,18家常见OA系统全方位大阅兵 原文地址:http://ec.zdnet.com.cn/managesoft/2009/1104/1503211.shtml 凡是比较或者评测的 ...

  3. sqlsugar的sum的用法

    通过论坛的检索 查到三篇文章是关于sum的 http://www.codeisbug.com/Ask/9/4531 http://www.codeisbug.com/Ask/14/4128 文章1:2 ...

  4. [Swift]扩展String类:实现find()查找子字符串在父字符串中的位置

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. java基本数据类型所占字节数

    JAVA基本数据类型所占字节数是多少?(32位系统) byte     1字节                short    2字节                int      4字节      ...

  6. ROS学习笔记三:编写第一个ROS节点程序

    在编写第一个ROS节点程序之前需要创建工作空间(workspace)和功能包(package).   1 创建工作空间(workspace) 创建一个catkin_ws: #注意:如果使用sudo一次 ...

  7. Linux环境下使用yum安装zip和unzip

    Linux环境下使用yum安装zip和unzip. yum install zip yum install unzip

  8. JAVA Android王牌教程

    Java基础 在Java基础系列文章中,我将说明Java的基础内容,特别是面向对象的相关概念. Java基础01 从HelloWorld到面向对象 Java基础02 方法与数据成员 Java基础03 ...

  9. C. Dasha and Password 预处理 + dp

    http://codeforces.com/contest/761/problem/C 对于每一个字符串,可以预处理出其到达数字,字母,和特殊符号所需的最小步数. 然后就是在n个东西中,选出数字.字母 ...

  10. html5改良的input元素的种类

    1.url类型.email类型.date类型.time类型.datetime类型.datetime-local类型. month类型.week类型.number类型.range类型.search类型. ...