在没有创建数据直方图之前,查询优化器是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. 使用cloudflare加速你的网站隐藏你的网站IP

    前言 cloudflare 是一家国外的 CDN 加速服务商,还是很有名气的.提供免费和付费的加速和网站保护服务.以前推荐过的百度云加速的国外节点就是和 cloudflare 合作使用的 cloudf ...

  2. BZOJ 1305:dance跳舞(二分+最大流)

    一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩 ...

  3. 本地锁、redis分布式锁、zk分布式锁

    本地锁.redis分布式锁.zk分布式锁 https://www.cnblogs.com/yjq-code/p/dotnetlock.html 为什么要用锁? 大型站点在高并发的情况下,为了保持数据最 ...

  4. AutoIT: WinGetText的作用

    WinGetText是一个非常有用的函数,可以获取页面上一切可见的资源,这为自动化测试的验证功能提供了保证.可以使用一些字符串处理函数来对获取来的页面文本进行分析. If StringInStr(Wi ...

  5. 利用http_load测试Web引擎性能

    http_load是基于linux平台的性能测试工具,它体积非常小,仅100KB.它以并行复用的方式运行,可以测试web服务器的吞吐量与负载. 一.获得http_load httpd_load的官方站 ...

  6. 转载:NOR Flash擦写和原理分析

    1. NOR FLASH 的简单介绍 NOR FLASH 是很常见的一种存储芯片,数据掉电不会丢失.NOR FLASH支持Execute On Chip,即程序可以直接在FLASH片内执行(这意味着存 ...

  7. 使用java发送HTTP请求

    public class Test { public static void main(String[] args) { BufferedReader in = null; String result ...

  8. hdu4815 概率问题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 好久没写dp了..最开始题意都理解错了, 哎!!我现在很饿也很困!! AC代码: #includ ...

  9. 组件-实体-系统 Entiy-Compoent-System ECS架构整理

    继承体系的问题,为什么要用ECS 面向对象的问题 当一个新的类型需要多个老类型的不同功能的时候,不能很好的继承出来 游戏开发后期会有非常多的类,很难维护 游戏中子系统很多,它们对一个对象的关注点往往互 ...

  10. [App Store Connect帮助]九、衡量 App 表现(1)分析和报告概述

    App Store Connect 提供如下分析和报告,以衡量您 App 的表现并查看向您支付的最终付款. App 分析 通过 App Store 展示次数.产品页面查看次数.销售额.App 使用次数 ...