`
MauerSu
  • 浏览: 509393 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Oracle模糊查询之(2.如何测试模糊查询的时间及使用是否使用索引)反向索引与模糊查询

 
阅读更多
源:http://blog.csdn.net/haiross/article/details/12974581
评:数据库索引分为 正向与反向索引,模糊查询时 注意编写sql是可以走 索引的

反向索引与模糊查询
反向索引应用于前模糊的用法简介:

1、反向索引

SQL> create index ind_name on atest reverse(name);

SQL>  select * from atest where name like reverse ('%y');


2、联合部分反向索引

SQL> create index ind_idname on atest (id ,reverse(name));
索引已创建。
SQL> select * from atest where id=1 and name like reverse ('%y');
未选定行

具体用法展示如下:

反向索引与模糊查询
---------------------

版本
SQL> select * from v$version;
BANNER                                                                        
----------------------------------------------------------------              
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod              
PL/SQL Release 10.2.0.4.0 - Production                                        
CORE 10.2.0.4.0 Production                                                    
TNS for 32-bit Windows: Version 10.2.0.4.0 - Production                       
NLSRTL Version 10.2.0.4.0 - Production                                        

测试数据
SQL> conn an/an
已连接。
SQL> create table atest(id int,name varchar2(100));
表已创建。
SQL> insert into atest select 1,'anbaisheng' from dual;
已创建 1 行。
SQL> insert into atest select 2,'xiangxiang' from dual;
已创建 1 行。
SQL> insert into atest select 3,'baby' from dual;
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from atest;
        ID NAME                                                               
---------- --------------------                                               
         1 anbaisheng                                                         
         2 xiangxiang                                                         
         3 baby                                                               


创建正续索引
SQL> create index ind_name on atest(name);
索引已创建。
SQL> set autotrace on
SQL> select * from atest where name like 'a%';
        ID NAME                                                               
---------- --------------------                                               
         1 anbaisheng                                                         
                                                                              
--------------------------------------------------------------------------------
| Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Ti
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |          |     1 |    65 |     2   (0)| 00
|   1 |  TABLE ACCESS BY INDEX ROWID| ATEST    |     1 |    65 |     2   (0)| 00
|*  2 |   INDEX RANGE SCAN          | IND_NAME |     1 |       |     1   (0)| 00
--------------------------------------------------------------------------------
                                                                              
Predicate Information (identified by operation id):                           
---------------------------------------------------                           
                                                                              
   2 - access("NAME" LIKE 'a%')                                               
       filter("NAME" LIKE 'a%')                                               

SQL> select * from atest where name like '%y';
        ID NAME                                                               
---------- --------------------                                               
         3 baby                                                               

---------------------------------------------------------------------------   
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |   
---------------------------------------------------------------------------   
|   0 | SELECT STATEMENT  |       |     1 |    65 |     3   (0)| 00:00:01 |   
|*  1 |  TABLE ACCESS FULL| ATEST |     1 |    65 |     3   (0)| 00:00:01 |   
---------------------------------------------------------------------------   
                                                                              
Predicate Information (identified by operation id):                           
---------------------------------------------------                           
                                                                              
   1 - filter("NAME" LIKE '%y')                                               
                                                                            
正向索引后模糊查询有效,前模糊无效

创建反向索引
SQL> drop index ind_name;
索引已删除。
SQL> create index ind_name on atest reverse(name);
索引已创建。
SQL>  select * from atest where name like '%y';
        ID NAME                                                               
---------- --------------------                                               
         3 baby                                                               

---------------------------------------------------------------------------   
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |   
---------------------------------------------------------------------------   
|   0 | SELECT STATEMENT  |       |     1 |    65 |     3   (0)| 00:00:01 |   
|*  1 |  TABLE ACCESS FULL| ATEST |     1 |    65 |     3   (0)| 00:00:01 |   
---------------------------------------------------------------------------   
                                                                              
Predicate Information (identified by operation id):                           
---------------------------------------------------                           
                                                                              
   1 - filter("NAME" LIKE '%y')                                               
                                                                              

SQL>  select * from atest where name like reverse ('%y');
未选定行
                                                                              
--------------------------------------------------------------------------------
| Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Ti
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |          |     1 |    65 |     0   (0)| 00
|   1 |  TABLE ACCESS BY INDEX ROWID| ATEST    |     1 |    65 |     0   (0)| 00
|*  2 |   INDEX RANGE SCAN          | IND_NAME |     1 |       |     0   (0)| 00
--------------------------------------------------------------------------------
                                                                              
Predicate Information (identified by operation id):                           
---------------------------------------------------                           
                                                                              
   2 - access("NAME" LIKE 'y%')                                               
       filter("NAME" LIKE 'y%')                                               
                                                                              
就算建上反向索引,不使用reverse关键字前模糊也没用,后模糊无效

联合部分反向索引
这个conception里都没说,自己试了下,还成
SQL> create index ind_idname on atest (id ,reverse(name));
索引已创建。
SQL> select * from atest where id=1 and name like reverse ('%y');
未选定行
                                                                              
--------------------------------------------------------------------------------
| Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Ti
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |          |     1 |    65 |     0   (0)| 00
|*  1 |  TABLE ACCESS BY INDEX ROWID| ATEST    |     1 |    65 |     0   (0)| 00
|*  2 |   INDEX RANGE SCAN          | IND_NAME |     1 |       |     0   (0)| 00
--------------------------------------------------------------------------------
                                                                              
Predicate Information (identified by operation id):                           
---------------------------------------------------                           
                                                                              
   1 - filter("ID"=1)                                                         
   2 - access("NAME" LIKE 'y%')                                               
       filter("NAME" LIKE 'y%')                                               
                                                                              
SQL>  select * from atest where id=1 and name like '%y';
未选定行
--------------------------------------------------------------------------------
| Id  | Operation                   | Name       | Rows  | Bytes | Cost (%CPU)|
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |            |     1 |    65 |     2   (0)|
|*  1 |  TABLE ACCESS BY INDEX ROWID| ATEST      |     1 |    65 |     2   (0)|
|*  2 |   INDEX RANGE SCAN          | IND_IDNAME |     1 |       |     1   (0)|
--------------------------------------------------------------------------------
                                                                              
Predicate Information (identified by operation id):                           
---------------------------------------------------                           
                                                                              
   1 - filter("NAME" LIKE '%y')                                               
   2 - access("ID"=1)                                                         
                                                                              
就算是联合索引,不使用reverse的话意义也不大
分享到:
评论

相关推荐

    详解Oracle数据库中文全文索引.docx

    5. 索引引擎提取词法分析器中的所有标记、文档段在分段器中的偏移量以及被称为非索引字的低信息含量字列表,并构建反向索引。 使用Oracle Text需要具有CTXAPP角色或者是CTXSYS用户。具有CTXAPP角色的用户可执行以下...

    基于Oracle数据库索引的查询优化研究.pdf

    在Oracle实时应用集群中,尤其是在值连续增长的列上,反向索引表现出色。 2.3 位图索引 位图索引适用于列值较少的情况,它为每个可能的列值创建一个位图,使用位元表示对应行是否包含该值。位图索引能够节省空间,...

    09 oracle的索引 PPT

    Oracle数据库是世界上最广泛使用的数据库系统之一,其性能优化的一个关键因素就是索引的使用。索引可以帮助快速查找和访问数据库中的数据,显著提高查询效率。本篇将详细讲解Oracle数据库中的索引及其重要性。 一、...

    Oracle索引分析与比较

    本篇文章将深入探讨Oracle中的B*Tree索引、反向索引、降序索引、位图索引和函数索引。 1. **B*Tree索引**: - B*Tree索引是Oracle中最常见的索引类型,其结构类似于二叉树,可以高效地处理高基数数据列,即具有...

    Oracle优化全攻略一【Oracle 索引概念】.docx

    总的来说,理解Oracle索引的工作原理并适当使用,是实现数据库高效运行的关键。正确选择和设计索引,避免使用限制索引的因素,能显著提高查询性能,减少数据库响应时间,从而提升整个系统的性能。在实践中,需要结合...

    oracle索引,常见索引问题

    Oracle数据库中的索引是优化查询性能的关键工具,它允许快速定位和访问数据。常见的索引类型包括B*树索引和位图索引,每种都有其特定的应用场景和优势。 1. **B*树索引**:这是最常见的索引类型,类似于二叉树结构...

    oracle的索引学习

    本篇文章将深入探讨Oracle索引的学习,重点关注索引的原理、类型、优缺点以及如何使用和分析执行计划。 首先,理解索引的基本概念。索引是一种特殊的数据结构,它存储在表空间中,用于加速对表数据的访问。当执行...

    Oracle数据库中的索引管理技术.pdf

    当使用 B-树索引时,Oracle 顺着索引节点树向下查找有查询选择条件相匹配的索引项。 (2)反向键索引 反向键索引是一种特殊类型的索引,它可以快速查找具有相同列值的记录。反向键索引是基于表中的一个或多个列...

    Oracle Index 索引介绍

    Oracle索引是数据库管理系统中用于提高查询效率的重要数据结构。它的工作原理类似于书籍的目录,允许数据库系统快速定位到所需的数据行,而无需扫描整个表。索引的存在使得对大量数据的查找、排序和聚合操作变得更加...

    Oracle索引优化

    Oracle索引优化是数据库性能调优的关键环节,它关乎到数据检索速度和整体系统的效率。在Oracle数据库中,索引的种类繁多,包括B*Tree索引、反向索引、降序索引、位图索引和函数索引等。理解并正确使用这些索引类型...

    oracle索引类型及扫描方式大整理

    反向索引是B*Tree索引的一种变体,它通过反转字节来实现更均匀的索引分布,降低竞争。 2. **降序索引**:8i版本后引入,专为降序排序的查询设计,使得逆序查找更为高效。 3. **位图索引**:主要用于OLAP(在线分析...

    oracle索引的建立、修改、删除.doc

    应用系统的性能直接与索引的建立是否合理直接有关。 一、建立索引 建立索引的目的是为了提高对表的查询速度;对表有关列的取值进行检查。但是,对表进行 insert,update,delete 处理时,由于要表的存放位置记录到...

    oracle索引类型及扫描方式大整理new

    ### Oracle索引类型详解 #### 一、B\*Tree索引:数据检索的基石 在Oracle数据库中,B\*Tree索引是最常见的索引结构,也是默认创建的索引类型。它基于二叉树原理,由分支块(branch block)和叶块(leaf block)构成,...

    Oracle索引在数据查询中的应用.pdf

    本文主要探讨了Oracle索引在数据查询中的应用,包括索引的基本概念、工作原理、使用场合以及优化策略。 首先,索引是一种特殊的数据结构,类似于书籍的目录,用于快速定位表中特定行的位置。Oracle使用B-Tree结构来...

    oracle 索引

    4. Reverse索引:反向索引,将键值的字节顺序反转,减少键冲突,提高查询性能。 5. Index-organized table (IOT):索引组织表,数据存储在索引结构中,适合插入密集型操作。 三、索引的优点与缺点 优点: 1. 提高...

    Oracle-索引.ppt

    总之,理解Oracle索引的种类和工作原理对于数据库管理员和开发者来说至关重要,因为它直接影响到数据库系统的性能和效率。正确地设计和管理索引能够极大地提升数据库的查询速度,从而提高整个系统的服务质量和用户...

Global site tag (gtag.js) - Google Analytics