Oracle中Index Merge与and_equal 的变迁

and_equal是Oracle支持的一种特定操作,可以将多个单列索引进行合并(Index Merge)输出查询结果。

同时and_equal可以通过Hints来进行强制,最少指定两个索引,最多指定5个。

以下的执行计划是常见的and_equal执行方式:

SQL> select /*+ and_equal(t1 iu ii) */  username,password from t1 where username='EYGLE' and user_id=58;

USERNAME                       PASSWORD

------------------------------ ------------------------------

EYGLE                          B726E09FE21F8E83

执行计划

----------------------------------------------------------

Plan hash value: 1425017857

------------------------------------------------------------------------------------

| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |      |     1 |    47 |     2   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS BY INDEX ROWID| T1   |     1 |    47 |     2   (0)| 00:00:01 |

|   2 |   AND-EQUAL                 |      |       |       |            |          |

|*  3 |    INDEX RANGE SCAN         | II   |     1 |       |     1   (0)| 00:00:01 |

|*  4 |    INDEX RANGE SCAN         | IU   |     1 |       |     1   (0)| 00:00:01 |

------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

1 - filter("USERNAME"='EYGLE' AND "USER_ID"=58)

3 - access("USER_ID"=58)

4 - access("USERNAME"='EYGLE')

但是从Oracle 10g开始,and_equal操作被废弃(depricated)掉,Oracle不再支持。这里废弃的含义并不是被彻底移除,而是说不再进行改进,通过hints仍然可以强制实现Index Merge的and_equal操作。

以上的输出就是来自Oracle 10.2.0.4,在使用rule提示时,Oracle会主动选择and_equal,所以不再支持是因为,这种方法限制过多,而且远不如复合索引来的灵活:

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> select /*+ rule */  username,password from t1 where username='EYGLE' and user_id=58;

USERNAME                       PASSWORD

------------------------------ ------------------------------

EYGLE                          B726E09FE21F8E83

执行计划

----------------------------------------------------------

Plan hash value: 3072843751

--------------------------------------------

| Id  | Operation                   | Name |

--------------------------------------------

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-09-19 09:08:02

Oracle中Index Merge与and_equal 的变迁的相关文章

Oracle中merge into的使用 (转)

该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1.insert 和update是可选的 2.UPDATE 和INSERT 后面可以跟WHERE 子句 3.在ON条件中可以使用常量来insert 所有的行到目标表中,不需要连接到源表和目标表 4.UPDATE 子句后面可以跟delete 来去除一些不需要的行. create table PRODUCTS (

Oracle中merge into的使用 (转)

http://blog.csdn.net/yuzhic/article/details/1896878 http://blog.csdn.net/macle2010/article/details/5980965   该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1,insert 和update是可选的 2,UPDATE 和INSERT 后面可以跟WHE

ORACLE中的的HINT详解_oracle

hints是oracle提供的一种机制,用来告诉优化器按照我们的告诉它的方式生成执行计划.我们可以用hints来实现:   1) 使用的优化器的类型   2) 基于代价的优化器的优化目标,是all_rows还是first_rows.   3) 表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid.   4) 表之间的连接类型   5) 表之间的连接顺序   6) 语句的并行程度   2.HINT可以基于以下规则产生作用   表连接的顺序.表连接的方法.访问路径.并行度   3.HINT

Oracle中的优化器--CBO和RBO

Oracle中的优化器--CBO和RBO Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO)          RBO: Rule-Based Optimization 基于规则的优化器          CBO: Cost-Based Optimization 基于代价的优化器 RBO自ORACLE 6以来被采用,一直沿

Oracle中的并行

Oracle中的并行 一Oracle中的并行 首先Oracle会创建一个进程用于协调并行服务进程之间的信息传递这个协调进程将需要操作的数据集例如表的数据块分割成很多部分称为并行处理单元然后并行协调进程给每个并行进程分配一个数据单元.例如有四个并行服务进程它们就会同时处理各自分配的单元当一个并行服务进程处理完毕后协调进程就会给它们分配另外的单元如此反复直到表上的数据都处理完毕最后协调进程负责将每个小的集合合并为一个大集合作为最终的执行结果返回给用户.并行处理的机制实际上就是把一个要扫描的数据集分成

index merge的数据结构和成本评估

1. 概述:index merge的数据结构 index merge的主要数据结构仍然是存放在SEL_TREE中: class SEL_TREE :public Sql_alloc { ... List<SEL_IMERGE> merges; ... }; 在merges这个list中存放了所有可能的index merge.本文将从几个案例,来看看SEL_TREE/SEL_IMERGE如何代表一个index merge访问方式.本文将不再重复介绍SEL_ARG/SEL_TREE的Range相关

Oracle 的 Index

oracle 索引( Index )是常见的数据库对象,它的设置好坏.使用是否得当,极大地影响数据库应用程序和Database 的性能.虽然有许多资料讲索引的用法, DBA 和 Developer 们也经常与它打交道,但笔者发现,还是有不少的人对它存在误解,因此针对使用中的常见问题,讲三个问题.此文所有示例所用的数据库是 Oracle 8.1.7 OPS on HP N series ,示例全部是真实数据,读者不需要注意具体的数据大小,而应注意在使用不同的方法后,数据的比较.本文所讲基本都是陈词

Oracle中如何管理索引组织表

索引组织表(IOT)有一种类B树的存储组织方法.普通的堆组织表是以一种无序的集合存储.而IOT中的数据是按主键有序的存储在B树索引结构中.与一般B树索引不同的的是,在IOT中每个叶结点即有每行的主键列值,又有那些非主键列值. 在IOT所对应的B树结构中,每个索引项包括<主键列值,非主键列值>而不是ROWID,对于普通堆组织表,oracle会有对应的索引与之对应,且分开存储.换句话说,IOT即是索引,又是实际的数据. 索引组织表(IOT)不仅可以存储数据,还可以存储为表建立的索引.索引组织表的数

oracle中OBJ4 ORA-8102故障恢复案例

  下面我们一起来看看关于oracle中OBJ4 ORA-8102故障恢复案例,希望本文章可以帮助到各位朋友. 在测试环境中对于OBJ$中i_obj4中出现ORA-8102进行了重新并恢复测试,认为自己已经比较清楚的掌握了I_OBJ4的ORA-8102问题处理,可是实际的一个案例,还是比较比实验中复杂,这里贴出来主要操作供大家参考,再次证明数据库恢复的场景不可大意,客户的故障只有你想不到的,没有遇不到的 通过bbed修改obj$中dataobj$重现I_OBJ4索引报ORA-08102错误 使用