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)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书, ...
随机推荐
- ffmpeg调试相关知识点
1.若要调试FFMPEG,在编译时应当在configure时,加上 --enable-debug --disable-asm 注:在调试x264时就应该加上这两个配置选项,方能调试 2.make in ...
- SQL Server 添加一条数据获取自动增长列的几种方法
数据库表设计 邓老师(老邓教的) insert into TestOne ','Test011') select @@IDENTITY as '自动增长ID' 杨老师(老杨教的) insert ...
- WinForm实现窗体最小化后小图标在右边任务栏下
一 基本功能1. 首先新建一个窗体,然后拖入一个名为 NotifyIcon 的控件,名字我没有改,就那个名字 2. 我的应用程序下有些图标文件,这里我用这个图标,我选择 013.ico 3. 选择 ...
- 自定义view(自定义view的时候,三个构造函数各自的作用)
package com.timeshare.tmband.Utils; import android.content.Context; import android.content.res.Typed ...
- URI--http://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E8%B5%84%E6%BA%90%E6%A0%87%E5%BF%97%E7%AC%A6
维基百科,自由的百科全书 在电脑术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串. 该种标识允许用户对网络中( ...
- iOS二进制和资源包的自检
因为现在做的是企业版的APP,不能保证用户不越狱,也不能保证有些用户喜欢自己修改ipa包里的资源文件,比如更换一些资源图片.因此,我们有必要在请求报文中,增加正版应用的二进制和资源文件的标识,让服务器 ...
- Mac下获取AppStore安装包文件路径-取出安装包
问题描述:我们通过AppStore下载软件的时候想要把安装包保存下来,但是AppStore安装好之后会自动删除安装包,而且安装路径也很难找到. 解决方案: 一.打开活动监视器 二.找storedown ...
- SQL in Qt (一)
Connecting to Databases To access a database with QSqlQuery or QSqlQueryModel, create and open one o ...
- js 去掉字符串最后一个字符
var str = str.substring(0,str.length-1); alert(str); 注:length 需小写.
- Oracle之PLSQL总结
基本数据类型变量 1. 基本数据类型 Number 数字型 Int 整数型 Pls_integer 整数型,产生溢出时出现错误 Binary_integer 整数型,表示带符号 ...