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)的一种.里面存放了用户的数据,跟表一样需要占用磁盘空间.只不过,在索引里的数据存放形式与表里的数据存放形式非常的不一样.在理解索引时,可以想象一本书, ...
随机推荐
- 在apache2.4版本之前做客户端访问控制,是用Allow Deny Order指令做访问控制的,
在apache2.4版本之前做客户端访问控制,是用Allow Deny Order指令做访问控制的,而在2.4的版本上是用的用法跟之前的版本大不相同,如下 ###################### ...
- stagefright框架(一)Video Playback的流程
在Android上,預設的多媒體框架(multimedia framework)是OpenCORE. OpenCORE的優點是兼顧了跨平台的移植性,而且已經過多方驗證,所以相對來說較為穩定:但是其缺點 ...
- SFTP CONFIGURATION IN FLASHFXP PROGRAM
This is a brief guide on how to configure the FlashFXP FTP client to log on to the domain web space ...
- Andrord问题小结
问题描述:Gradle version 2.10 is required. Current version is 2.8.Gradle版本由2.8升为2.10后,发现所有依赖play-services ...
- C++输入和输出
本文转载:blog.csdn.net/zhanghaotian2011/article/details/8868577博客 输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出 ...
- 设计模式--委托模式C++实现
原文章地址:http://www.cnblogs.com/zplutor/archive/2011/09/17/2179756.html [委托模式 C++实现] 我对.Net的委托模型印象很深刻,使 ...
- MySql数据库学习--存储过程(1)
在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用户入门. 存储过程介绍 存储过程是一组为了 ...
- shell全备份脚本(借鉴别人的,在其基础上修复完善了bug)
#!/bin/bash # Shell script to backup MySql database # Last updated: Aug - MyUSER="root" # ...
- 协同办公平台Worktile体验分享(转)
自从组建团队以来,做的每一个项目.每一次活动,电脑里就会存放了N个不同名称的相同文档, 工作内容.资源文档非常零散,严重影响了工作效率. 之前用Dropbox共享文档,结果被墙了.用印象笔记,结果一个 ...
- PowerDesigner15在生成SQL时报错Generation aborted due to errors detected during the verification of the mod
转载: http://blog.csdn.net/successful555/article/details/7582154 PowerDesigner中如何设置字符编码为GBK或者GB2312 ht ...