oracle数据库使用hint来让模糊查询走索引
在没有创建数据直方图之前,查询优化器是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来让模糊查询走索引的更多相关文章
- 【MySQL 原理分析】之 Explain & Trace 深入分析全模糊查询走索引的原理
一.背景 今天,交流群有一位同学提出了一个问题.看下图: 之后,这位同学确实也发了一个全模糊查询走索引的例子: 到这我们可以发现,这两个sql最大的区别是:一个是查询全字段(select *),而一个 ...
- Oracle数据库,忽略大小写Like模糊查询(SQL Server,MySql原理相同)
背景 在使用Oracle或者其它数据库时,使用like 关键字进行模糊查询是大家经常使用的功能,在纯中文环境中使用非常好用,还有一些通配符可以使用,但是在纯英文环境中,会出现大小需要精确匹配的问题,主 ...
- Oracle 数据库中在使用中文模糊查询时输入中文查询不到结果的解决方法
添加环境变量 变量名:NLS_LANG 变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
- oracle SQL语句练习MERGE、模糊查询、排序、
Oracle支持的SQL指令可分为数据操作语言语句.数据定义语言语句.事务控制语句.会话控制语句等几种类型:1.数据操作语言语句数据操作语言语句(Data manipulation language, ...
- Oracle数据库中有关记录个数的查询
一.查询表中全部的记录个数 可用两种方法,一种是在oracle的系统表中统计,另一种需要写存储过程统计,方法分别如下. 1.系统表中统计: SELECT sum(num_rows) FROM user ...
- Oracle 表分组 group by和模糊查询like
分组group by写法 select 字段名 from 表名 group by 字段名 查询这个字段名里的种类分组后可以加聚合函数select 字段名,聚合函数 from 表名 group by 字 ...
- Oracle数据库几种启动方式及查询当前状态
Oracle数据库几种启动方式 1.startup nomount: 非安装启动,这种方式下启动可执行:重建控制文件.重建数据库,读取init.ora文件,启动instance,即启动SGA和后台进程 ...
- Oracle中查询走索引的情况
1.对返回的行无任何限定条件,即没有where子句 2.未对数据表与任何索引主列相对应的行限定条件例如:在City-State-Zip列创建了三列复合索引,那么仅对State列限定条件不能使用这个索引 ...
- Oracle数据库对象(表空间/同义词/序列/视图/索引)
数据库对象 Oracle数据库对象: 数据库对象是数据库的组成部分,常常用 CREATE 命令进行创建,可以使用 ALTER 命令修改,用 DROP 执行删除操作. 种类: (1)表空间:所有的数据对 ...
随机推荐
- cassandra删除所有数据,重置为初始状态——删除<data dir>/data/* <data dir>/commitlog/* <data dir>/saved_caches/* 重启cassandra即可
Are you looking for a method other than drop keyspace? Okay based on your clarification... I would s ...
- RDD基础
RDD的两种操作 1.Tansformation(转化操作):返回值还是一个RDD 2.Action(行动操作):返回值不是一个RDD 第一种Transformation是返回一个新的RDD ...
- I.MX6 PLL5 clock hakcing
/************************************************************************** * I.MX6 PLL5 clock hakci ...
- [学习笔记]dsu on a tree(如何远离线段树合并)
https://www.zybuluo.com/ysner/note/1318613 背景 这玩意来源于一种有局限性的算法. 有一种广为人知的,树上离线维护子树信息的做法. (可以参照luogu360 ...
- AppDomain加载与释放dll
AppDomain加载与释放dll 几年前写过同名随笔,但今天应不大适用了.但还有几个朋友留言关注,我重新发布相关代码. 首先我们的目的就是运行期间更新dll,并应用dll.这个过程需要应用 AppD ...
- zabbix 监控ssdb
zabbix 的啥基础知识啥的,请看由本站大牛凉白开先生写的zabbix教程.这里说说如何监控ssdb.SSDB 是一个 C/C++ 语言开发的高性能 NoSQL 数据库, 支持 KV, list, ...
- IJ:IntelliJ IDEA安装
ylbtech-IJ:IntelliJ IDEA安装 响应速度快 1.返回顶部 1. 2. 3. 4. 5. 6. 7. 2. 接受协议,激活IJ返回顶部 1. 2. 3. 4. 5. 6.0. 6. ...
- codeforces 28D(dp)
D. Don't fear, DravDe is kind time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- thinkphp 中 dump 函数调试数组时显示不全解决方法
在php.ini里的 xdebug 节点中,加入如下 xdebug.var_display_max_children=128 #子级节点最多显示的的字符数xdebug.var_display_max_ ...
- [BZOJ2056]gift? 高精度?
Description Input 输入的第一行为一个整数t. 接下来t行,每行包含九个自然数. Output 输出t行 每行一个整数,表示\(2^a+2^b+2^c+2^d+2^e+2^f+2^g+ ...