堆组织表,索引组织表和索引聚簇表 .

简介:
1. 堆组织表:
   通常我们默认建的表就是堆组织表。
   语法:Create table test(  
    Id int,  
    Name varchar2(10)  
  );
   此类型的表中,数据会以堆的方式进行管理,增加数据时候,会使用段中找到的第一个能放下
   此数据的自由空间。当从表中删除数据时候,则允许以后的UPDATE和INSERT重用这部分空间,
   它是以一种有些随机的方式使用。
   
   很多初学者会想当然的以为数据的插入会按顺序进行,第一条肯定排在第一位,接着是第二条,一直到最后。
   可当SELECT查询的时候,返回的结果往往让人失望。排列的顺序让人大跌眼镜,下面来看一个例子。
   
   create table t(   
   a int,  
   b varchar2(4000) default rpad('*', 4000, '*'),  
   c varchar2(3000) default rpad('*', 3000,'*')  
 );  
   
 insert into t(a) values (1);  
 insert into t(a) values (2);  
 insert into t(a) values (3);  
 delete from t where a=2;  
 insert into t(a) values (4);  
   
 SQL> select a from t;  
   
          A  
 ----------  
          1  
          4  
          3 

  全表扫描时,会按命中的顺序来获取数据,而不是按插入的顺序。
  这是一个必要要了解的重要的数据库概念。一般来说,数据库表本质上是无序的数据组合。 
  
2. 索引组织表(index organized table, IOT):就是存储在一个索引结构中的表,数据按主键进行存储和排序。
   适用的场景:
    a.完全由主键组成的表。这样的表如果采用堆组织表,则表本身完全是多余的开销,
      因为所有的数据全部同样也保存在索引里,此时,堆表是没用的。
    b.代码查找表。如果你只会通过一个主键来访问一个表,这个表就非常适合实现为IOT.
 c.如果你想保证数据存储在某个位置上,或者希望数据以某种特定的顺序物理存储,IOT就是一种合适的结构。 IOT提供如下的好处:
  ·提高缓冲区缓存效率,因为给定查询在缓存中需要的块更少。
  ·减少缓冲区缓存访问,这会改善可扩缩性。
  ·获取数据的工作总量更少,因为获取数据更快。
  ·每个查询完成的物理I/O更少。
   如果经常在一个主键或唯一键上使用between查询,也是如此。如果数据有序地物理存储,就能提升这些查询的性能。
    语法:create table indexTable(
  ID varchar2 (10), 
  NAME varchar2 (20), 
  constraint pk_id primary key (ID)
  ) organization index;
3. 索引聚簇表:
   聚簇是指:如果一组表有一些共同的列,则将这样一组表存储在相同的数据库块中;聚簇还表示把相关的数据存储在同一个块上。
   利用聚簇,一个块可能包含多个表 的数据。概念上就是如果两个或多个表经常做链接操作,那么可以把需要的数据预先存储在一起。
   聚簇还可以用于单个表,可以按某个列将数据分组存储。  
   语法:
   索引聚簇表是基于一个索引聚簇(index cluster)创建的。
   里面记录的是各个聚簇键。聚簇键和我们用得做多的索引键不一样,索引键指向的是一行数据,
   聚簇键指向的是一个ORACLE BLOCK。我们可以先通过以下命令创建一个索引簇。
   create cluster emp_dept_cluster
( deptno number(2) )
size 1024
/

   size参数:
   向聚簇中放数据之前,需要先对聚簇建立索引。可以现在就在聚簇中创建表,
   但是由于我们想同时创建和填充表,而有数据之前必须有一个聚簇索引,所以我们先来 建立聚簇索引。
   create index emp_dept_cluster_idx
on cluster emp_dept_cluster
/
    
    建表:
    create table dept
( deptno number(2) primary key, 
      dname varchar2(14),
  loc varchar2(13)
)
cluster emp_dept_cluster(deptno)
/

    create table emp
(  empno    number primary key, 
 ename    varchar2(10), 
 job      varchar2(9), 
 mgr      number, 
 hiredate date, 
 sal      number, 
 comm     number,
 deptno number(2) constraint emp_fk references dept(deptno)
) cluster emp_dept_cluster(deptno)
    /

   什么时候不应该使用聚簇?
   1) 如果预料到聚簇中的表会大量修改:
    必须知道,索引聚簇会对DML的性能产生某种负面影响(特别是INSERT语句)。管理聚簇中的数据需要做更多的工作。
2) 如果需要对聚簇中的表执行全表扫描:不只是必须对你的表中的数据执行全面扫描,
   还必须对(可能的)多个表中的数据进行全面扫描。由于需要扫描更多的数据, 所以全表扫描耗时更久。
3) 如果你认为需要频繁地TRUNCATE和加载表:聚簇中的表不能截除。
 这是显然的,因为聚簇在一个块上存储了多个表,必须删除聚簇表中的行。

  因此,如果数据主要用于读(这并不表示“从来不写”;聚簇表完全可以修改),
 而且要通过索引来读(可以是聚簇键索引,也可以是聚簇表上的其他索引),
 另外 会频繁地把这些信息联结在一起,此时聚簇就很适合。





本文转自 vfast_chenxy 51CTO博客,原文链接:http://blog.51cto.com/chenxy/752298,如需转载请自行联系原作者

目录
相关文章
|
存储 索引
【软考学习15】索引文件结构、直接索引和间接索引
【软考学习15】索引文件结构、直接索引和间接索引
361 0
|
16天前
|
数据库 索引
联合索引和单独列索引哪个更好
【10月更文挑战第15天】联合索引和单独列索引哪个更好
37 2
|
4月前
|
SQL 存储 关系型数据库
(五)MySQL索引应用篇:建立索引的正确姿势与使用索引的最佳指南!
在本篇中,则重点讲解索引应用相关的方式方法,例如各索引优劣分析、建立索引的原则、使用索引的指南以及索引失效与索引优化等内容。
662 0
|
数据库 索引
表索引——索引的设计原则
前言 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。本节将介绍一些索引的设计原则。
|
存储 安全 Java
看懂哈希表及RandomPool结构
Java中最常用的哈希表莫过于HashMap和HashSet了,两者的结构一致,原理一致,唯独区别在于HashMap有伴随数据Value而HashSet没有。
117 0
看懂哈希表及RandomPool结构
|
SQL 存储 缓存
索引不是越多越好,理解索引结构原理,才有助于我们建立合适的索引!
MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引。
652 0
|
数据库 索引
存在逻辑删除的表字段上建立唯一索引的巧办法 (逻辑删除与唯一索引)
设计数据库唯一索引时,经常会碰到唯一删除的键值,导致很难处理,这里就简单介绍一种巧办法,帮你快速解决该问题
1971 0
存在逻辑删除的表字段上建立唯一索引的巧办法 (逻辑删除与唯一索引)
|
存储 关系型数据库 索引
索引组织表
说明聚集索引及索引组织表的关系及使用场景,优势。
2335 0
|
Go 索引
维护索引——通过重组索引提高性能
原文:维护索引——通过重组索引提高性能 前言: 如果碎片程度小于30%,建议使用重组而不是重建。因为重组不会锁住数据页或者数据表,并且降低CPU的资源。 总得来说,重组会清空当前的B-TREE,特别是索引的叶子节点,重组数据页和消除碎片。
1075 0