以下内容主要都是关于oracle 10g位图索引,重点是存储,其它优缺点,查询机制等也略微介绍,概因为存储机制是根基。
内容主要分四个部分:
1)来源于http://blog.chinaunix.net/uid-20687159-id-1894992.html
2)来源于http://blog.sina.com.cn/s/blog_4c6fef63010085m8.html
3)来自oracle官方文档的和其它一些。
4)个人的试验,看位图索引的情况。
------------------------------
要想升入dw等,了解位图索引是必不可少的。
了解位图索引的关键是知道索引的内部结构,知道结果,自然知道它的优缺点,所以了解结构是核心。
一,oracle官方文档
关于位图索引的概要介绍-定义、查询原理、优点、缺点。
这里只是一个笔记,非官方原文,摘取了纲要内容:
1.定义,什么是位图索引:就是用位图表示的索引,oracle对于选择度底的列的每个键值建立一个位图,位图中的每一位可能对应多个列,位图中位等于1表示特定的行含有此位图表示的键值。
2.查询,由于索引是位图,所以很多很多时候可以对这些索引中的位图进行位运算-(and 和 or),这样的速度明显比b树快(某些情况下)。由于位图索引可以存储null,所以可以直接通过位图索引计数(肯定是准确的)。后面提到的有点和位图的计算方式是直接相关的。
3.位图的优点(主要针对dw):
- 减少即席查询的相应时间
- 和其它类型索引比较,真正节约了索引数据空间
- 即使在非常差的硬件上,也可能会有戏剧化的性能提升
- 高效的并行DML和LOAD操作。
- 生成索引的时候更高效,首先是不排序,其次是占用的空间少(索引空间)。
- 可以通过位图索引直接计数。
4.位图索引的缺点(其它资料),也不好说是缺点
- 不适合选择度底的列
- 如果有比较频繁的insert,update等操作,可能导致性能很底下,因为更新索引用的是行锁(可能锁定多行),而不是排它锁。
- 可能会溢出,索引数据块难于放下整个索引值,这导致低效。
二,http://blog.chinaunix.net/uid-20687159-id-1894992.html
示意图-逻辑分析位图
主要至关了解下位图:
![oracle位图索引 - 我行我素 - 逝者如斯夫,不舍昼夜](http://img9.ph.126.net/bof3CYPnCu1AulqipM8oHw==/2536933965111196479.jpg)
![oracle位图索引 - 我行我素 - 逝者如斯夫,不舍昼夜](http://img9.ph.126.net/P2_hPhJa5iK9yejP9J-k6g==/6597822932122195259.jpg)
![oracle位图索引 - 我行我素 - 逝者如斯夫,不舍昼夜](http://img8.ph.126.net/AbHjrjiNqcGLaxzUufhZpw==/6597879007215213368.jpg)
需要注意的是,这只是个示意图,实际上每个位图的位数并非刚好等于记录数,而是会根据情况来分解,否则对于居多的数据而言,位图未免太大了。
三,http://blog.sina.com.cn/s/blog_4c6fef63010085m8.html
深入研究--数据块中如何存储
这是真正的深入了解。
为了省事,暂时不修改原文的样式
一.什么是位图索引 |
索引创建的原则:
1、平衡查询和dml操作,在dml操作频繁的表上尽量避免创建索引,过多的索引会降低dml操作的效率
2、将索引放在独立的表空间中,不要与表,还原段,临时段放在同一个表空间中因为索引段会与这些段竞争I/0
3、使用统一的extent尺寸,这样的目的是减少系统的转换时间
4、对于大索引可以设置nologging这样的目的是减少redo操作来提高系统的效率
5、索引的initrans通常比相对于的表高,因为相同的数据块存储的索引项比表的记录数要多,索引应该支持更高的并发访问。
语法:
create [unique|bitmap] index [username.] index_name
on [username.] table_name
(column_name[asc|desc] [,column_name[asc|desc]])
[tablespace tablespace_name]
[pctfree 正整数]
[initrans 正整数]
[maxtrans 正整数]
[存储子句]
[LOGGING|NOLOGGING]
[NOSORT]
查看索引的状态信息:table,tablespace,type,status,通过数据字典dba_indexes
查看索引所基于的列和表信息通过数据字典 dba_ind_columns
====================================
二、随着索引所基于的表上的dml操作的频繁程度,索引的效率会降低。此时就需要重建索引
1、重建索引的过程中可以移动索引到其他的表空间中
alter index schema.index_name rebuild
tablespace tablespace_name;
2、重建索引过程中修改存储参数storage子句
alter index index_name rebuild
pctfree 40
storage (next 300K)
实际上在上面的存储参数的修改不起作用,因为next参数是在创建本地管理的表空间时就设定的,本地管理的表空间无法改变next_extent参数的大小。
3、重建后的索引数据块将消除哪些已经删掉的索引记录,同时索引树也将变得更加平衡,效率随之得到提高
4、在大规模装载数据之前为了避免索引段的自动扩展,可以手动为索引段分配磁盘空间
alter index index_name allocate extent
5、回收索引段中没有用到的磁盘空间
alter index index_name deallocate unused
6、合并索引段中的碎片命令
alter index index_name coalesce
7、truncate表时也会释放基于该表上的索引段的全部磁盘空间
8、重建索引时可以采用联机方式重建索引,这样可以实现在重建索引时即可以使用select语句在索引上又可以同时在索引上使用dml操作。
alter index index_name rebuild online
==========================================
三、监督索引的使用情况
1、开启索引为监督状态
alter index index_name monitoring usage
2、发出一个sql查询语句,影响到oracle所建立的索引的使用情况(利用索引列查询记录,索引列添加到where中)
3、使用数据字典v$object_usage来获取索引的使用情况
select index_name ,table_name,monitoring,used,start_monitoring,end_monitoring from v$object_usage
4、清楚了索引的使用情况后,关闭索引的监督
alter index index_name nomonitoring usage
==================================
四、删除索引
drop index index_name
============================
五、创建索引的过程
1、create [unique|bitmap] index index_name
on table_name(column_name)
pctfree 正整数
storage(initial 正整数 next 正整数)
tablespace tablespace_name
2、确认索引的状态信息
select index_name,table_name,tablespace_name,index_type,status,uniqueness from dba_indexes
3、确认索引所基于的列信息
select index_name,table_name,column_name,index_owner,table_owner from dba_ind_columns
where table_owner='' and index_name like '';
4、确认索引的存储参数的设置是否正确
select index_name,pct_free,pct_increase,initial_extent,next_extent from dba_indexes
where owner='' and tablespace_name like '';