模糊查询与索引(先看,这里从模糊查询语法非哪种索引角度来提高查询效率)
2013-10-18 16:43
921 查看
模糊查询与索引
模糊查询与索引参考 http://tech.ccidnet.com/art/3089/20080405/1410979_1.html。
通配符(%)在搜寻词首出现,一般会导致Oracle系统不使用索引。因此,要尽量避免在模糊查询中使用通配符开头,或者是开头结尾都有通配符,这样会导致降低查询速度。
--创建一个name字段的索引
create index IDX_B$L_INTEREST_INFO_NAME
on B$L_INTEREST_INFO (NAME);
以下语句不能使用name字段索引:
select * from b$l_interest_info
where name like
'%瑞德工业园%';
2 ----------------------------------------------------------------------------
3 | Id | Operation |
Name | Rows | Bytes |
Cost (%CPU)|
4 ----------------------------------------------------------------------------
5 | 0 |
SELECT STATEMENT | |
141K| 8139K| 5426 (4)|
6 | 1 | TABLE
ACCESS FULL| B$L_INTEREST_INFO |
141K| 8139K| 5426 (4)|
7 ----------------------------------------------------------------------------
如果遇到模糊查询的例子,尽量将通配符放在末尾,以常量开头,那么可以使用上索引,如下语句所示:
select * from b$l_interest_info
where name like
'瑞德工业园%';
2 -----------------------------------------------------------------------------------------------
3 | Id | Operation |
Name | Rows | Bytes |
Cost (%CPU)|
4 -----------------------------------------------------------------------------------------------
5 | 0 |
SELECT STATEMENT | | 1278 |
75402 | 360 (1)|
6 | 1 | TABLE
ACCESS BY INDEX
ROWID| B$L_INTEREST_INFO | 1278 |
75402 | 360 (1)|
7 | 2 |
INDEX RANGE SCAN | IDX_B$L_INTEREST_INFO_NAME | 1278 | |
6 (0)|
8 -----------------------------------------------------------------------------------------------
如果必须将通配符放在开头,以常量结束,那么可以创建一个反向键索引
--在name字段创建一个反向键索引
create index idx_interest_info_name_re
on b$l_interest_info(reverse(name));
analyze table b$l_interest_info
compute statistics
for table for all
indexes;
--没有用到反向键索引
select * from b$l_interest_info
where name like
'%瑞德工业园';
2 ----------------------------------------------------------------------------
3 | Id | Operation |
Name | Rows | Bytes |
Cost (%CPU)|
4 ----------------------------------------------------------------------------
5 | 0 |
SELECT STATEMENT | |
141K| 8139K| 5426 (4)|
6 | 1 | TABLE
ACCESS FULL| B$L_INTEREST_INFO |
141K| 8139K| 5426 (4)|
7 ----------------------------------------------------------------------------
因此,要使用反向键索引还必须加上reverse关键字
--用上了反向键索引IDX_INTEREST_INFO_NAME_RE
select * from b$l_interest_info
where reverse(name)
like reverse('%瑞德工业园');
2 ----------------------------------------------------------------------------------------------
3 | Id | Operation |
Name | Rows | Bytes |
Cost (%CPU)|
4 ----------------------------------------------------------------------------------------------
5 | 0 |
SELECT STATEMENT | |
141K| 8139K| 5233 (1)|
6 | 1 | TABLE
ACCESS BY INDEX
ROWID| B$L_INTEREST_INFO |
141K| 8139K| 5233 (1)|
7 | 2 |
INDEX RANGE SCAN | IDX_INTEREST_INFO_NAME_RE |
25429 | | 77 (2)|
8 ----------------------------------------------------------------------------------------------
如果开头结尾都要用到通配符,且select获取的字段只有该模糊查询字段,则可以用上索引:
--用到了name字段的一般索引IDX_B$L_INTEREST_INFO_NAME
select name
from b$l_interest_info where
name like '%瑞德工业园%';
2 ----------------------------------------------------------------------------------------
3 | Id | Operation |
Name | Rows | Bytes |
Cost (%CPU)|
4 ----------------------------------------------------------------------------------------
5 | 0 |
SELECT STATEMENT | |
141K| 1379K| 1915 (7)|
6 | 1 | INDEX
FAST FULL SCAN| IDX_B$L_INTEREST_INFO_NAME |
141K| 1379K| 1915 (7)|
7 ----------------------------------------------------------------------------------------
但是对于使用%%这种查询且select获取的字段包含了模糊查询字段以外的,就很难用上索引了。
相关文章推荐
- vc++socket编程
- C#——方法参数 params
- Ubuntu下安装OpenSSH Server使之可以被远程连接 ssh: connect to host 192.168.XX.XX port 22: Connection refused
- UIButton使用状态
- ORACLE 序列-整理
- 算法数据结构C++实现6 - 行排序 列排序 Column sort
- SQL Server 全文搜索 配置、查询初体验
- C#多线程学习(一) 多线程的相关概念
- 这几天得把监控优化工作的数据给落实政策到位
- 软件测试面试大全
- Google tile和TMS的索引算法
- Win 7与win xp下Ping批处理
- a标签用jquery的attr添加onclick方法无效的解决
- http通信和tcp通信
- nginx做负载CDN加速获取端真实ip
- 用PHP实现游戏中的一些常见功能
- python 将字典组装成updatesql
- 选择屏幕初始化值以及选择屏幕输入后的变化
- oracle模糊查询:分区局部全文索引方式(四)
- 第八周上机实践