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)表空间:所有的数据对 ...
随机推荐
- 洛谷 P1072 Hankson 的趣味题 —— 质因数分解
题目:https://www.luogu.org/problemnew/show/P1072 满足条件的数 x 一定是 a1 的倍数,b1 的因数,a0/a1 与 x/a1 互质,b1/b0 与 b1 ...
- Tomcat闪退的解决办法
1 首先考虑的是端口占用 2 现在讲的是这一种方法 (1)找到解压缩的文件的bin目录 找到startup.bat 记事本打开 开头加上两句话 SET JAVA_HOME=C:\Program Fil ...
- ExtJS 4 MVC Viewport和card布局
http://ext4all.com/post/a-little-bit-strange-navigation 效果图: app/view/Viewport.js Ext.define('App.v ...
- CCF 201409-1 相邻数对 (水题)
问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 输出一个整数,表示值正好 ...
- bzoj 3830: [Poi2014]Freight【dp】
参考:https://blog.csdn.net/zqh_wz/article/details/52953516 妙啊 看成分段问题,因为火车只能一批一批的走(易证= =)设f[i]为到i为止的车都走 ...
- Step 4: Install and Configure Databases
https://www.cloudera.com/documentation/enterprise/latest/topics/cm_ig_installing_configuring_dbs.htm ...
- VS2010创建C++静态链接库创建和使用
VS2010创建C++静态链接库的方法: 1. 创建一个新项目,在已安装的模板中选择“常规”,在右边的类型下选择“空项目”,在名称和解决方案名称中输入 staLIB.点击确定. 2.在解决方案资源管理 ...
- LBP特征 学习笔记
这几天一直在做人脸识别的项目,有用到LBP特征,但是毫无头绪,师姐这几天也比较忙,没有时间来指导我,随自己找相应的介绍LBP的博文来看,现在总算有了一个大体的思路了,就写下来吧 注:参考博文: 目标检 ...
- 51nod 1098 最小方差
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; ty ...
- 洛谷 P3285 [SCOI2014]方伯伯的OJ
看到这题,第一眼:平衡树水题,随便做一做好了 然后....我在花了n个小时去调试(维护平衡树父节点)之后,... 调了三个小时后,第一次失败的代码(只能查找排名为k的用户编号,不能根据编号查排名) # ...