oracle中的B-TREE索引
在字段值情况不同的条件下测试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索引的更多相关文章
- Oracle中NULL值与索引
NULL值是关系数据库系统布尔型(true,false,unknown)中比较特殊类型的一种值,通常称为UNKNOWN或空值,即是未知的,不确定的.由于NULL存在着无数的可能,因此NULL值也不等于 ...
- 怎么解决ORACLE 中 CHAR类型的索引问题
在很多场景中,都有如下情况 trim(a.colunm1) = trim(b.colunm2) 应该怎么优化呢? 用到 TRIM 的很多原因是某些系统为了提高查询效率,不使用 ORACLE 的特有的 ...
- oracle中查询用户表/索引/视图创建语句
不多说,直接上干货 1.查询当前用户下表的创建语句 select dbms_metadata.get_ddl('TABLE','ux_future') from dual; 2.查询其他用户下表的创建 ...
- Oracle中组合索引的使用详解(转)
在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引.在组合索引的使用方面,Oracle有以下特点: 1. 当使用基于规则的优化器(RBO)时,只有当组合索引的前导列出现在SQL语句的w ...
- mysql--->B+tree索引的设计原理
1.什么是数据库的索引 每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不 ...
- 索引优化原则及Oracle中索引总结
索引建立原则 确定针对该表的操作是大量的查询操作还是大量的增删改操作. 尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引. where语句中不得不对查 ...
- Oracle中的索引详解
Oracle中的索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.索引是一种允许直接访问数据表中某一数据行的树型结构,为了提高查询效率而引入,是 ...
- [转]Oracle中的索引详解
原文地址:http://www.oschina.net/question/30362_4057 一. ROWID的概念 存储了row在数据文件中的具体位置:64位 编码的数据,A-Z, a-z, 0- ...
- Oracle中如何导出存储过程、函数、包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句?
Oracle中如何导出存储过程.函数.包和触发器的定义语句?如何导出表的结构?如何导出索引的创建语句? QQ群里有人问:如何导出一个用户下的存储过程? 麦苗答:方法有多种,可以使用DBMS_MET ...
- Oracle中B-TREE索引的深入理解(转载)
索引概述 索引与表一样,也属于段(segment)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书, ...
随机推荐
- SqlLikeAttribute 特性增加 左、右Like实现
SqlLikeAttribute 特性原来只实现了全Like,今天增加左.右Like实现 更新时间:2016-04-30 /// <summary> /// 获取查询条件语句 /// &l ...
- 杭电OJ—— 1084 What Is Your Grade?
What Is Your Grade? Problem Description “Point, point, life of student!” This is a ballad(歌谣)well kn ...
- Spring中注解的使用详解
一:@Rsource注解的使用规则 1.1.案例演示 Spring的主配置文件:applicationContext.xml(因为我这里将会讲到很多模块,所以我用一个主配置文件去加载各个模块的配置文件 ...
- [ofbiz]entitymode中类型的对照关系
在实体数据结构的时候,习惯于数据库的设计模式,int,varchar等各种类型,但是在entitymode中不是直接使用数据库的类型模式,而是自己定义了一套数据类型(type). 如何找到两者之间的对 ...
- Ajax 用法, 实现方法,JS原生与JQ实现
AJAX 详解 ajax是实现页面异步加载. 常用于, 前后端数据交互, 实现前端页面无刷新更改操作. 是web前端和后端使用者开发的必备使用技能~~ Ajax操作~ : 俗话原理 : 用俗话来 ...
- flask 后台表单验证模块
我不想直接用flask的wtf模块,太大,功能太多,用不了.但后台也不能不做验证吧,我比较懒,不想一行一行写代码验证,所以就写了一个验证模块,对于小项目也够用了 # encoding=utf-8 # ...
- mysql 主键自增
比如创建表格,表格ID需要自增 将ID设置成主键,并配置auto_increment 例: create table test( id int(4) not null primary key ...
- C语言--流程控制
一.流程控制 1.顺序结构 *默认的流程结构,按照书写顺序执行每一条语句 2.选择结构 *对给定的条件进行判断,再根据判断结果来决定执行那一段代码 3.循环结构 *在给定条件成立的情况下,反复执行某一 ...
- 从数据库读取数据后显示成html标签
也许很多人从数据库中读的数据是不需要数据成html标签的,但是也许有一天你们会发现当我们需要输出成html标签时编译器却自动帮我们输出成字符串了这是我们可以这样来 方法1: 最常用的方法,使用JS或J ...
- 定制化Azure站点Java运行环境(4)
定制化使用您自己的Tomcat版本和JDK环境 在上面章节中,介绍了如何通过web.config,定制默认的Azure website的Java运行环境,默认情况下,Azure站点的Tomcat是7. ...