用示例说明BitMap索引的效率要优于B-Tree索引
一、实验说明:
操作系统:rhel 5.4 x86
数据库:Oracle 11g R2
二、操作步骤:
首先创建一张t_btree表,并建立B-Tree索引,索引键是status:
1 SQL> create table t_btree as select * from dba_objects; 2 3 Table created. 4 5 SQL> create index status_btree on t_btree(status); 6 7 Index created.
执行两次下面的查询语句,并显示执行计划:
1 SQL> set autotrace traceonly; 2 SQL> select count(*) from t_btree where status='VALID'; 3 4 5 Execution Plan 6 ---------------------------------------------------------- 7 Plan hash value: 2400455617 8 9 -------------------------------------------------------------------------------------- 10 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 11 -------------------------------------------------------------------------------------- 12 | 0 | SELECT STATEMENT | | 1 | 5 | 49 (0)| 00:00:01 | 13 | 1 | SORT AGGREGATE | | 1 | 5 | | | 14 |* 2 | INDEX FAST FULL SCAN| STATUS_BTREE | 74307 | 362K| 49 (0)| 00:00:01 | 15 -------------------------------------------------------------------------------------- 16 17 Predicate Information (identified by operation id): 18 --------------------------------------------------- 19 20 2 - filter("STATUS"='VALID') 21 22 Note 23 ----- 24 - dynamic sampling used for this statement (level=2) 25 26 27 Statistics 28 ---------------------------------------------------------- 29 32 recursive calls 30 0 db block gets 31 261 consistent gets 32 458 physical reads 33 0 redo size 34 424 bytes sent via SQL*Net to client 35 419 bytes received via SQL*Net from client 36 2 SQL*Net roundtrips to/from client 37 0 sorts (memory) 38 0 sorts (disk) 39 1 rows processed 40 41 SQL> select count(*) from t_btree where status='VALID'; 42 43 44 Execution Plan 45 ---------------------------------------------------------- 46 Plan hash value: 2400455617 47 48 -------------------------------------------------------------------------------------- 49 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 50 -------------------------------------------------------------------------------------- 51 | 0 | SELECT STATEMENT | | 1 | 5 | 49 (0)| 00:00:01 | 52 | 1 | SORT AGGREGATE | | 1 | 5 | | | 53 |* 2 | INDEX FAST FULL SCAN| STATUS_BTREE | 74307 | 362K| 49 (0)| 00:00:01 | 54 -------------------------------------------------------------------------------------- 55 56 Predicate Information (identified by operation id): 57 --------------------------------------------------- 58 59 2 - filter("STATUS"='VALID') 60 61 Note 62 ----- 63 - dynamic sampling used for this statement (level=2) 64 65 66 Statistics 67 ---------------------------------------------------------- 68 0 recursive calls 69 0 db block gets 70 180 consistent gets 71 0 physical reads 72 0 redo size 73 424 bytes sent via SQL*Net to client 74 419 bytes received via SQL*Net from client 75 2 SQL*Net roundtrips to/from client 76 0 sorts (memory) 77 0 sorts (disk) 78 1 rows processed
接着创建跟t_btree一样的表t_bmap,并创建BitMap索引。
1 SQL> create table t_bmap as select * from dba_objects; 2 3 Table created. 4 5 SQL> create bitmap index status_bmap on t_bmap(status); 6 7 Index created.
同样执行之前的语句两次:
1 SQL> select count(*) from t_bmap where status='VALID'; 2 3 4 Execution Plan 5 ---------------------------------------------------------- 6 Plan hash value: 516980546 7 8 --------------------------------------------------------------------------------------------- 9 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 10 --------------------------------------------------------------------------------------------- 11 | 0 | SELECT STATEMENT | | 1 | 5 | 3 (0)| 00:00:01 | 12 | 1 | SORT AGGREGATE | | 1 | 5 | | | 13 | 2 | BITMAP CONVERSION COUNT | | 62928 | 307K| 3 (0)| 00:00:01 | 14 |* 3 | BITMAP INDEX FAST FULL SCAN| STATUS_BMAP | | | | | 15 --------------------------------------------------------------------------------------------- 16 17 Predicate Information (identified by operation id): 18 --------------------------------------------------- 19 20 3 - filter("STATUS"='VALID') 21 22 Note 23 ----- 24 - dynamic sampling used for this statement (level=2) 25 26 27 Statistics 28 ---------------------------------------------------------- 29 32 recursive calls 30 0 db block gets 31 72 consistent gets 32 266 physical reads 33 0 redo size 34 424 bytes sent via SQL*Net to client 35 419 bytes received via SQL*Net from client 36 2 SQL*Net roundtrips to/from client 37 0 sorts (memory) 38 0 sorts (disk) 39 1 rows processed 40 41 SQL> select count(*) from t_bmap where status='VALID'; 42 43 44 Execution Plan 45 ---------------------------------------------------------- 46 Plan hash value: 516980546 47 48 --------------------------------------------------------------------------------------------- 49 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 50 --------------------------------------------------------------------------------------------- 51 | 0 | SELECT STATEMENT | | 1 | 5 | 3 (0)| 00:00:01 | 52 | 1 | SORT AGGREGATE | | 1 | 5 | | | 53 | 2 | BITMAP CONVERSION COUNT | | 62928 | 307K| 3 (0)| 00:00:01 | 54 |* 3 | BITMAP INDEX FAST FULL SCAN| STATUS_BMAP | | | | | 55 --------------------------------------------------------------------------------------------- 56 57 Predicate Information (identified by operation id): 58 --------------------------------------------------- 59 60 3 - filter("STATUS"='VALID') 61 62 Note 63 ----- 64 - dynamic sampling used for this statement (level=2) 65 66 67 Statistics 68 ---------------------------------------------------------- 69 0 recursive calls 70 0 db block gets 71 6 consistent gets 72 0 physical reads 73 0 redo size 74 424 bytes sent via SQL*Net to client 75 419 bytes received via SQL*Net from client 76 2 SQL*Net roundtrips to/from client 77 0 sorts (memory) 78 0 sorts (disk) 79 1 rows processed
从上面的查询中,我们可以得到,分别给两张内容一样的表做查询的时候,在执行第二次的时候是属于软解析:
从一致性读上比较,B-Tree索引的consistent gets是180,BitMap的是6;
从Cost的消耗上看,B-Tree索引的COST是49,而BitMap的是3。
在索引键是高重复率键值(status)的时候情况下BitMap索引的效率要优于B-Tree索引。
转载于:https://www.cnblogs.com/Richardzhu/archive/2012/12/24/2831044.html
用示例说明BitMap索引的效率要优于B-Tree索引相关推荐
- 非索引查询如何提高效率_Python数据分析:数据库索引如何提高效率?
- 点击上方"中国统计网"订阅我吧!- 索引在数据库中是一个很特殊的存在,它的目的就是为了提高数据查询得效率.同样,它也有弊端,更新一个带索引的表的时间比更新一个没有带索引的时间更 ...
- mysql索引_mysql系列:深入理解mysql 索引特性(屡试不爽的mysql索引总结)
原标题:mysql系列:深入理解mysql 索引特性(屡试不爽的mysql索引总结) mysql为什么使用B+ Tree索引,不使用B- Tree索引? 索引顺序如何生效? 什么是覆盖索引? orde ...
- MySQL索引(B+Tree 索引、哈希索引、全文索引、 空间数据索引)、索引优化、优点、使用场景
1. MySQL 索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现. 1.1 B+Tree 索引 是大多数 MySQL 存储引擎的默认索引类型. 因为不再需要 ...
- php普通索引和唯一索引,mysql下普通索引和唯一索引的效率对比
昨天有位同事说,他的网页查询过程中发现普通索引和唯一索引的效率是有差别的,普通索引比唯一索引快 今天在我的虚拟机中布置了环境,测试抓图如下: 抓的这几个都是第一次执行的,刷了几次后,取平均值,效率大致 ...
- oracle全局索引 效率,关于插入,全局索引和局部索引的情况,那种效率高
分区表上的索引 表可以按range,hash,list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部索引和全局索引,下面分别对这2种索引的特点和局限 ...
- Oracle索引梳理系列(四)- Oracle索引种类之位图索引
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- 【翻译】SQL Server索引进阶:第三级,聚集索引
原文地址: Stairway to SQL Server Indexes: Level 3, Clustered Indexes 本文是SQL Server索引进阶系列(Stairway to SQL ...
- sorl java 建索引_solr 的客户端调用solrj 建索引+分页查询
在 solr 3.5 配置及应用(一) 讲过一了 solr 3.5的详细配置,本节我们讲利用solr 的客户端调用solr的应用了! 一.利用SolrJ操作solr API 使用SolrJ操作Solr ...
- delphi报列表索引越界怎么处理_图解Elasticsearch索引机制,此篇带你领悟新世界...
前言 随着Elastic的上市,ELK不仅在互联网大公司得到长足的发展,而且在各个中小公司都得到非常广泛的应用,甚至连"婚庆网站"都开始使用Elasticsearch了.随之而来的 ...
最新文章
- Linux Kernel TCP/IP Stack — L3 Layer
- unity安装,sdk,jdk问题
- 使用鸿蒙系统的家电厂商,除了华为外!谁还会用鸿蒙系统?米OV们不可能:这些巨头才会用...
- oracle 统计文本字符串,oracle人员权限,字符串转列,统计管理详解-Oracle
- 考大学计算机考试作文,机考作文
- ASP.NET MVC Model绑定(五)
- 如何实现伸缩 (折叠) 报表?
- 转: Nginx proxy讲解精华文章集
- 正视苦难,民族的心灵史——1942
- qcc烧录工具QCC30xx/QCC51xx全系列支持烧录工具qcc3020/3040/5124/5126qcc烧录软件
- msvcr71.dll文件丢失——解决办法
- 嵌入式硬件设计:电感
- php excel导入功能
- kafka 修改分区_kafka的分区数设置
- python中pass的含义_python中pass语句意义与作用(实例分析)
- Blackboard在线教学管理平台
- 他升职加薪,竟然是因为这样舔狗?
- RSA数据加密解密(各种语言)
- 【How2Pwn】DreamHack 中的Hook Overwrite问题
- 成都中小学教师计算机,2016成都市中小学教师继续教育网