Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1380397
  • 博文数量: 247
  • 博客积分: 10147
  • 博客等级: 上将
  • 技术积分: 2776
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-24 15:18
文章分类

全部博文(247)

文章存档

2013年(11)

2012年(3)

2011年(20)

2010年(35)

2009年(91)

2008年(87)

我的朋友

分类: Oracle

2008-06-17 15:29:26

An   index-organized   table   has   a   storage   organization   that   is   a   variant   of   a   primary   B-tree.   Unlike   an   ordinary   (heap-organized)   table   whose   data   is   stored   as   an   unordered   collection   (heap),   data   for   an   index-organized   table   is   stored   in   a   B-tree   index   structure   in   a   primary   key   sorted   manner.   Besides   storing   the   primary   key   column   values   of   an   index-organized   table   row,   each   index   entry   in   the   B-tree   stores   the   nonkey   column   values   as   well  
   
   
  索引组织表有一个可变的主B树存储组织。不象普通表(堆组织),数据是无序存储的集合。  
  索引组织表是以主键排序的方式的B树组织结构。   
   
****
heap table 就是一般的表,获取表中的数据是按命中率来得到的。没有明确的先后之分,在进行全表扫描的时候,并不是先插入的数据就先获取。数据的存放也是随机的,当然根据可用空闲的空间来决定。
而iot 就是类似一个全是索引的表,表中的所有字段都放在索引上,所以就等于是约定了数据存放的时候是按照严格规定的,在数据插入以前其实就已经确定了其位置,所以不管插入的先后顺序,它在那个物理上的那个位置与插入的先后顺序无关。这样在进行查询的时候就可以少访问很多blocks,但是插入的时候,速度就比普通的表要慢一些。
适用于信息检索、空间和OLAP程序。索引组织表的适用情况:
1、 代码查找表。
2、 经常通过主码访问的表。
3、 构建自己的索引结构。
4、 加强数据的共同定位,要数据按特定顺序物理存储。
5、 经常用between…and…对主码或唯一码进行查询。数据物理上分类查询。如一张订单表,按日期装载数据,想查单个客户不同时期的订货和统计情况。
经常更新的表当然不适合iot,因为oracle需要不断维护索引,而且由于字段多索引成本就大。
 
****
八楼的说的很对,因为索引组织的表数据所有字段都是根据索引组织的,因此每次插入都需要排序然后重新组织表结构,所以插入很慢,因此不适宜使用频繁改动的表(除非你希望每次插入都表根据索引键排序),但是由于数据全再索引上,因此索引已经将表排序好,所以访问的时候比较快(比访问普通索引快的原因是普通索引找到值后还要指向数据所在的块),并且,由于索引组织的表相同的索引键列中的内容放在一起,对于读取访问的块数也要少不少。
当然索引组织表对全表扫描不排序没什么好处。对不按照索引键访问的表也没什么好处。
 
****
*******************************************************

索引

索引是与表关联的可选结构.可以明确地创建索引,以加快对表执行SQL语句的速度.合理使用索引是减少磁盘I/O的主要方法.索引包括以下几种类型:
1.标准索引.
语法:
create index 索引名 on 表名(字段名)
实例如下:
create index ind_ename on emp(ename)
2.唯一索引.主键上会自动创建唯一索引.唯一索引确保在定义索引的列中,表的任意两行的值都不相同.
语法:
create unique index 索引名 on 表名(字段名)
实例:
create unique index ind_name on emp(ename)
3.组合索引,组合索引是在表中的多个列上创建的索引.
基于:select .... from table where ...and ... 此种多条件语句考虑建立组合索引
实例:
create index ind_name on emp(ename,sal)
4.反向键索引.此索引适合由序列组成的字段或者某数据分布密集的字段.
如:
原字段 反向键字段
1001   1001
1002   2001
1003   3001
1004   4001
是不是观察到哪边检索得快些?对,就是左边的反向键字段.
实例:
create index ind_empno on emp(empno) reverse
5.位图索引.使用位图索引的优点在于,它最适用于低基数列,也就是不同值的数目比表的行数少的列.如果某个列的值重复超过一百次,则可以考虑在该列上创建位图索引.
实例:
create bitmap index in_deptno on emp(deptno)
6.基于函数的索引.
为了方便操作,oracle提供了一个选项,可以基于一个或多个列上的函数或表达式创建索引.
如下所示:
create index ind_sal on emp(lower(ename)) 必须注意的是,要创建基于函数或表达式的索引,必须具有query rewaite 系统权限.
7.索引组织表.
索引组织表与普通表不同之处在于,该表的数据存储在与其关联的索引中.对表数据进行的修改,如添加新行,更新新行或删除行,只会导致索引的更新.索引组织表最大的优点,提高读取速度,降低I/O读写.建立索引组织表必须有一列为主键.
实例如下:
create table ind_table
(
id number primary key,
name varchar2(20)
)
organization index;

OK,下面再来讲讲索引中的分区.
与对表进行分区类似,Oracle也允许对索引分区.与表分区一样,索引分区可以存储在不同的表空间中.索引分区有如下三种类型:
(1)局部分区
局部分区索引是在分区表上创建的一种索引,在局部分区索引中,Oracle为表的每个分区建立一个独立的索引.
实例如下:
先创建一个分区表:
create table order_mast
(
order_id number(4),
order_name varchar2(20)
)
partition by range(order_id)
(
partition p1 values less than(1000),
partition p2 values less than(2000),
partition p3 values less than(maxvalue)
);

然后紧接着创建局部分区索引:
create index myindex on order_mast(order_id) local
(2)全局分区
全局分区是指在分区表或非分区表上创建的索引.全局索引的键可以引用存储在多个分区中的行.合璧索引是自己分区.
实例如下:
create index glb_ind on order_mast(order_id) global
partition by range(order_id)
(
partition p1 values less than(1500),
partition p2 values less than(maxvalue)
);

(3)全局非分区,索引中不分区,与普通索引相同.在此不在举例说明.

 
 
阅读(3045) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~