在字段值情况不同的条件下测试B-TREE索引效率

清空共享池和数据缓冲区
alter system flush shared_pool;
alter system flush buffer_cache;

创建测试表
create table ann_t1 as select object_id,object_name from dba_objects;
create table ann_t2 as select mode(object_id,2) objectid,object_name from dba_objects;

创建索引,默认为B树索引
create index idx_t1_objectid on ann_t1(object_id);
create index idx_t2_objectid on ann_t2(objectid);

收集统计信息
execute dbms_stats.gather_table_stats(ownname=>'bolan',tabname=>'ANN_T1',method_opt=>'for all indexed columns size 2',cascade=>TRUE);
execute dbms_stats.gather_table_stats(ownname=>'bolan',tabname=>'ANN_T2',method_opt=>'for all indexed columns size 2',cascade=>TRUE);

打开语句跟踪
set autotrace traceonly;

查询1:
select * from ann_t1 where object_id=1;
/*********************************************************************************************************************************/
no rows selected

Execution Plan
----------------------------------------------------------
Plan hash value: 1206843447

-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 29 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| ANN_T1 | 1 | 29 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T1_OBJECTID | 1 | | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("OBJECT_ID"=1)

Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
410 bytes sent via SQL*Net to client
513 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
/*********************************************************************************************************************************/

查询2:
select * from ann_t2 where objectid=1;
/*********************************************************************************************************************************/

38408 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 350754170

----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 38180 | 969K| 98 (2)| 00:00:02 |
|* 1 | TABLE ACCESS FULL| ANN_T2 | 38180 | 969K| 98 (2)| 00:00:02 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("OBJECTID"=1)

Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
2894 consistent gets
0 physical reads
0 redo size
1591370 bytes sent via SQL*Net to client
28684 bytes received via SQL*Net from client
2562 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
38408 rows processed

/*********************************************************************************************************************************/

发现ann_t2使用了全表扫描(因为CBO的原因),强制索引扫描
查询3:
select /*+index(ann_t2 idx_t2_objectid) */ * from ann_t2 where objectid=1;

/*********************************************************************************************************************************/
38408 rows selected.

Execution Plan
----------------------------------------------------------
Plan hash value: 3426877313

-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 38180 | 969K| 412 (1)| 00:00:05 |
| 1 | TABLE ACCESS BY INDEX ROWID| ANN_T2 | 38180 | 969K| 412 (1)| 00:00:05 |
|* 2 | INDEX RANGE SCAN | IDX_T2_OBJECTID | 38180 | | 73 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("OBJECTID"=1)

Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
5513 consistent gets
0 physical reads
0 redo size
1716248 bytes sent via SQL*Net to client
28684 bytes received via SQL*Net from client
2562 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
38408 rows processed
/*********************************************************************************************************************************/

结论:分析同样使用索引的跟踪结果,cost和consistent gets在“查询3”中的值均比“查询1”高,说明在“唯一值多”时选择B-tree索引可以提高查询效率;

补充:
1.因查询的列键值均存在于索引中,故均不产生physical reads;
2.之所以B-tree适用于“唯一值多”情况,是因为表数据量大致相同的情况下,存在重复值的列经过条件过滤后结果集较大,数据可能不完全分布在一个数据块上,故产生consistent gets较高;
3.列上定义了索引,查询未必走索引,因cbo的缘故,可能存在全表扫描比索引扫描效率高的情况,优化器自动选择了全表扫描;
4.Consistent Gets(数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块)
这里的概念是在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。这样就产生了一致性读。

5.借用一个图理解下B-tree索引的工作原理:

6.oracle的索引类型:B树索引,位图索引,HASH索引,基于函数的索引,反转键索引,分区索引等;

oracle中的B-TREE索引的更多相关文章

  1. Oracle中NULL值与索引

    NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种值,通常称为UNKNOWN或空值,即是未知的,不确定的.由于NULL存在着无数的可能,因此NULL值也不等于 ...

  2. 怎么解决ORACLE 中 CHAR类型的索引问题

    在很多场景中,都有如下情况 trim(a.colunm1) = trim(b.colunm2) 应该怎么优化呢? 用到 TRIM 的很多原因是某些系统为了提高查询效率,不使用  ORACLE 的特有的 ...

  3. oracle中查询用户表/索引/视图创建语句

    不多说,直接上干货 1.查询当前用户下表的创建语句 select dbms_metadata.get_ddl('TABLE','ux_future') from dual; 2.查询其他用户下表的创建 ...

  4. Oracle中组合索引的使用详解(转)

    在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引.在组合索引的使用方面,Oracle有以下特点: 1. 当使用基于规则的优化器(RBO)时,只有当组合索引的前导列出现在SQL语句的w ...

  5. mysql--->B+tree索引的设计原理

    1.什么是数据库的索引 每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不 ...

  6. 索引优化原则及Oracle中索引总结

    索引建立原则 确定针对该表的操作是大量的查询操作还是大量的增删改操作. 尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引. where语句中不得不对查 ...

  7. Oracle中的索引详解

    Oracle中的索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是 ...

  8. [转]Oracle中的索引详解

    原文地址:http://www.oschina.net/question/30362_4057 一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0- ...

  9. Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?

    Oracle中如何导出存储过程.函数.包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程?   麦苗答:方法有多种,可以使用DBMS_MET ...

  10. Oracle中B-TREE索引的深入理解(转载)

    索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书, ...

随机推荐

  1. kafka中处理超大消息的一些考虑

    Kafka设计的初衷是迅速处理短小的消息,一般10K大小的消息吞吐性能最好(可参见LinkedIn的kafka性能测试).但有时候,我们需要处理更大的消息,比如XML文档或JSON内容,一个消息差不多 ...

  2. .net 链接oracle

    虽然EF6都快要出来了,但是对于Oracle数据库,仍然只能用DB first和Model First来编程,不能用Code First真是一个很大的遗憾啊. 好了,废话少说,我们来看看EF中是如何用 ...

  3. ffmpeg的使用

    -i "转换前的视频绝对路径\文件名.mp4" -movflags faststart+rtphint "转换后的视频绝对路径\文件名.mp4" 上面这条语句是 ...

  4. 对Textbox的值转换为带千位符和小数的Decimal字符串

    以下Function可以用于textbox的KeyUp事件: 2014-06-06 发现旧版IE不支持selectionStart还有字符串的"[]"索引获取值, 已经修复这个bu ...

  5. WIN7 Net Configuration Assistant打不开

     转自  http://www.cnblogs.com/caojie0432/archive/2013/07/30/3225230.html  作者:db_suploc 今天在安装oracle10g的 ...

  6. 「前端开发者」如何把握住「微信小程序」这波红利?

    由于前两周一直在老家处理重要事情,虽然朋友圈被「微信小程序」刷爆了,但并没有时间深入了解. 昨天回广州之后,第一件事情就是把「微信小程序」相关的文章.开发文档.设计规范全部看了一遍,基本上明白了「微信 ...

  7. 沃通tomcat jks 安装配置

    废话不多说上代码: <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtoc ...

  8. hadoop高可用集群搭建小结

    hadoop高可用集群搭建小结1.Zookeeper集群搭建2.格式化Zookeeper集群 (注:在Zookeeper集群建立hadoop-ha,amenode的元数据)3.开启Journalmno ...

  9. RMAN之一:快速入门

    1.数据导出基础 (1)创建datapump导出文件的目录对象并为相应用户授予权限. 出于安全考虑,不允许oracle用户直接在OS上进行文件的操作,而应通过directory对象指定. SQL> ...

  10. 快速解决js开发下拉框中blur与click冲突

    在开发中我们会经常遇到blur和click冲突的情况.下面叙述了开发中常遇到的"下拉框"的问题,并提供了两种解决方案. 一.blur和click事件简述 blur事件:当元素失去焦 ...