欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Oracle表介绍--簇表 有大用


Oracle簇表介绍 (clustered table)

簇表概述

簇表(cluster) 是一种可以选的存储数据方式。簇表由1组拥有相同的列而且经常被一起使用的数据表构成,这组表在存储时会共享一部分Data Blocks, 例如,employees 和 departments表都包含department_id 这个列。 当用户将这两个表组合成1个簇表时,Oracle在物理上将employees 和 departments 两张表各行的department_id 字段存储在1个Data block里。

下图显示了由employees 和 departments 两张表构成的簇表是怎样
存储的。

Oracle簇表介绍 (clustered table) - 饥民 - 饥民2011

 
如上图,在1个簇表内,不同表的相关(related)数据行会被存储到1个Data Block中,因此有如下优点:
   
    * 连接(join) 簇表所需的磁盘I/O减少。

    * 连接簇表时间减少

    * 在1个簇表内,簇键(cluster key) 是指各簇键列(cluster key column)的值。1个簇内的
       有多个簇表的各个数据行所使用的相同的簇键值,在簇表及簇索引(cluster index)中只会被
       存储1次(参考上图)。因此与非簇表相比(nonclustered table)相比,簇表这存储相关的
       表和表数据所需的空间会减少。  如上图所示, 每个簇键(department_id)的值只会存储1次
       ,而两张表employees和 departments 中包含的相同簇键值的数据共享同1个簇键.



簇表的一些属性
簇键 cluster key
      簇键是列或多列的组合,为簇表所共有
      在创建簇表时指定簇键的列,以后在创建增加簇表中的每个表示,指定相同的列则可。
      每个簇键值在簇和簇索引中只存储1次,与不同表中有多少这样的行无关。

使用簇键的好处
      减少磁盘I/O, 减少了因使用连接表所带来系统开销
      节省了磁盘存储空间,因为原来要单独存放多张表,现在可以将连接的部分作为共享列存储。

什么情况下创建簇表
      对于经常
查询,DML操作比较少的表
         表中的记录经常被连接到其他表查询

创建簇表的步骤
     
创建簇表
      创建簇索引
      创建簇表的子表

创建簇表时应考虑的问题
     
哪些表适用于创建簇表
      对于创建簇的表那些列用作簇列
      创建簇时Data Blocks的空间如何使用(pctfree, pctused)
      平均簇键及所需相关行所需的空间大小
      簇索引的位置(比如存放到不同表空间)
      预估簇的大小


     

创建簇簇表
在创建簇表时,如果未指定索引列,则默认的创建1个索引簇。
如果指定了散列参数, 如haskeys,hashis 或single table hashkeys,则可以创建哈希簇.



先检查当前环境

Oracle簇表介绍 (clustered table) - 饥民 - 饥民2011
可以看出当前用户是HR, 用户的默认表空间是TS_EXAMPLE

创建簇

   CREATE CLUSTER EMP_DEPT_CLUSTER(DEPTNO NUMBER(2))
   PCTUSED 80
   PCTFREE 15
   SIZE 1024
   TABLESPACE USERS

上面语句就创建了1个簇,其中1个最重要的参数就是SIZE,需要为SIZE指定1个合适的值,如果太大,则每个块仅存放少量的簇,造成空间浪费,太小又会形成很多数据链。
注意TABLESPACE 字句,这里我们会将这个簇放入USER 这个表空间中,而不是用户HR默认的表空间TS_EXAMPLE.

注意:本地管理类型的表空间中, PCTUSED的设置是无效的.
关于PCTUSED PCTFREE 的参数可以参考我的另1篇blog
http://nvd11.blog.163.com/blog/static/200018312201282354948602/
如下图,利用上面语句创建了1个簇
 
Oracle簇表介绍 (clustered table) - 饥民 - 饥民2011

创建后可以通过查看user_clusters 来检索这个簇.
Oracle簇表介绍 (clustered table) - 饥民 - 饥民2011
 


创建簇索引
    创建簇索引的条件:
      * 模式中必须包含簇
      * 必须具有create any index 的权限.

   簇索引的作用
         用于1个簇键值并返回该簇键值的地址块. (注意簇中,每1个簇键值只存储1次啊)
   
   语法:
           Create index emp_dept_cluster_idx
                         on  cluster emp_dept_cluster


     创建后可以查看user_indexse来检索这个簇索引
Oracle簇表介绍 (clustered table) - 饥民 - 饥民2011
 



创建簇表
     创建簇表 cl_dept:
      CREATE TABLE CL_DEPT(
                       DEPTNO NUMBER(2) PRIMARY KEY,
                       DNAME VARCHAR2(14),
                       LOC VARCHAR2(13)
                       )
                cluster emp_dept_cluster(deptno)
 --cluster关键字后面跟簇名、簇列
                                                                               --作用就是分配该表给指定簇,同时指定簇键.

     
     CREATE TABLE CL_EMP(
                      EMPNO NUMBER PRIMARY KEY,
                      ENAME VARCHAR2(10),
                      JOB1  VARCHAR(9),
                      MGR   NUMBER,
                      HIREDATE DATE,
                      SAL   NUMBER,
                      COMM  NUMBER,
                      DEPTNO NUMBER(2) REFERENCES CL_DEPT(DEPTNO)  --
外键
                      )
                CLUSTER EMP_DEPT_CLUSTER(DEPTNO) ----
cluster关键字后面跟簇名、簇列

创建后可以查看user_tables来检索这两张簇表
Oracle簇表介绍 (clustered table) - 饥民 - 饥民2011
 
也可以从user_objects视图里查看:
Oracle簇表介绍 (clustered table) - 饥民 - 饥民2011
 
上图两个SYS开头的index是建立主键时系统自动建立的indexes.

下面对CL_DEPT 和 CL_EMP 插入数据. 从scott帐号的表导入
Oracle簇表介绍 (clustered table) - 饥民 - 饥民2011
 
记得commit;..

更改簇属性
     

   类似table
 可以用如下语句更改簇属性
Alter Cluster EMP_DEPT_CLUSTER
        pctree 20;


来自 https://www.cnblogs.com/nvd11/archive/2013/04/02/2996842.html



Oracle表介绍--簇表

簇和簇表        
 
    簇其实就是一组表,是一组共享相同数据块的多个表组成。 将经常一起使用的表组合在一起成簇可以提高处理效率。        
 
    在一个簇中的表就叫做簇表。建立顺序是:簇→簇表→数据→簇索引        
 
    1、创建簇的 格式        
 
    CREATE CLUSTER cluster_name
    (column date_type [,column datatype]...)
    [PCTUSED 40 | integer] [PCTFREE 10 | integer]
    [SIZE integer]
    [INITRANS 1 | integer] [MAXTRANS 255 | integer]
    [TABLESPACE tablespace]
    [STORAGE storage]
       
 
    SIZE:指定估计平均簇键,以及与其相关的行所需的字节数。        
 
    2、创建簇        
 

    create cluster my_clu (deptno number )

    pctused 60

    pctfree 10

    size 1024

    tablespace users

    storage (

       initial 128 k

       next 128 k

       minextents 2

       maxextents 20

    );

 
    3、创建簇表        
 

    create table t1_dept(

      deptno number ,

      dname varchar2 ( 20 )

    )

    cluster my_clu(deptno);

   

    create table t1_emp(

      empno number ,

      ename varchar2 ( 20 ),

      birth_date date ,

      deptno number

    )

    cluster my_clu(deptno);

 
    4、为簇创建索引        
 

    create index clu_index on cluster my_clu;

 
    注:若不创建索引,则在插入数据时报错:ORA-02032: clustered tables cannot be used before the cluster index is built        
  
管理簇        
 
    使用ALTER修改簇属性(必须拥有ALTER ANY CLUSTER的权限)        
 
    1、修改簇属性        
 
    可以修改的簇属性包括:        
    * PCTFREE、PCTUSED、INITRANS、MAXTRANS、STORAGE        
    * 为了存储簇键值所有行所需空间的平均值SIZE        
    * 默认并行度        
 
    注:        
    * 不能修改INITIAL和MINEXTENTS的值        
    * PCTFREE、PCTUSED、SIZE参数修改后适用于所有数据块        
    * INITRANS、MAXTRANS仅适用于以后分配的数据块        
    * STORAGE参数修改后仅影响以后分配给簇的盘区        
 
    格式:        

    alter cluster my_clu

    pctused 40

 
    2、删除簇        
 
    drop cluster my_clu; -- 仅适用于删除空簇        
 

    drop cluster my_clu including tables ; -- 删除簇和簇表            

 

    drop cluster my_clu including tables cascade constraints ;

    -- 同时删除外键约束            

 
    注:簇表可以像普通表一样删除。        
  
散列聚簇表        
 
    在簇表中,Oracle使用存储在索引中的键值来定位表中的行,而在散列聚簇表中,使用了散列函数代替了簇索引,先通过内部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行。创建散列簇需要用到HASHKEYS子句。        
 
    1、创建散列簇        
 

    create cluster my_clu_two(empno number(10) )

    pctused 70

    pctfree 10

    tablespace users

    hash is empno

    hashkeys 150 ;

 
    说明:        
    * hash is 子句指明了进行散列的列,如果列是唯一的标示行,就可以将列指定为散列值        
    * hashkeys 指定和限制散列函数可以产生的唯一的散列值的数量        
 
    2、创建散列表        
 

    create table t2_emp (

      empno number ( 10 ),

      ename varchar2 ( 20 ),

      birth_date date ,

      deptno number )

    cluster my_clu_two(empno);

 
    注意:        
    * 必须设置数值的精度(具体原因不详)        
    * 散列簇不能也不用创建索引        
    * 散列簇不能ALTER:size、hashkeys、hash is参数        

来自 https://www.cnblogs.com/edwardsun/p/3484017.html



Oracle 簇的使用详解

簇其实就是一组表,由一组共享相同数据块的多个表组成,将经常一起使用的表组合在一起成簇可以提高处理效率;在一个簇中的表就叫做簇表。
建立顺序是:簇→簇表→簇索引→数据
创建簇的格式
CREATE CLUSTER cluster_name
(column date_type [,column datatype]...)
[PCTUSED 40 | integer] [PCTFREE 10 | integer]
[SIZE integer]
[INITRANS 1 | integer] [MAXTRANS 255 | integer]
[TABLESPACE tablespace]
[STORAGE storage]
SIZE:指定估计平均簇键,以及与其相关的行所需的字节数。
1、创建簇
复制代码代码如下:

    create cluster my_clu (deptno number ) 
    pctused 60 
    pctfree 10 
    size 1024 
    tablespace users 
    storage ( 
    initial 128 k 
    next 128 k 
    minextents 2 
    maxextents 20 
    ); 

2、创建簇表
复制代码代码如下:

    create table t1_dept( 
    deptno number , 
    dname varchar2 ( 20 ) 
    ) 
    cluster my_clu(deptno); 
    create table t1_emp( 
    empno number , 
    ename varchar2 ( 20 ), 
    birth_date date , 
    deptno number 
    ) 
    cluster my_clu(deptno); 

3、为簇创建索引
复制代码代码如下:

create index clu_index on cluster my_clu;

注:若不创建簇索引,则在插入数据时报错:ORA-02032: clustered tables cannot be used before the cluster index is built
管理簇
使用ALTER修改簇属性(必须拥有ALTER ANY CLUSTER的权限)
1、修改簇属性
可以修改的簇属性包括:
* PCTFREE、PCTUSED、INITRANS、MAXTRANS、STORAGE
* 为了存储簇键值所有行所需空间的平均值SIZE
* 默认并行度
注:
* 不能修改INITIAL和MINEXTENTS的值
* PCTFREE、PCTUSED、SIZE参数修改后适用于所有数据块
* INITRANS、MAXTRANS仅适用于以后分配的数据块
* STORAGE参数修改后仅影响以后分配给簇的盘区
例:
复制代码代码如下:

    alter cluster my_clu 
    pctused 40 

2、删除簇
复制代码代码如下:

    drop cluster my_clu; -- 仅适用于删除空簇 
    drop cluster my_clu including tables ; -- 删除簇和簇表 
    drop cluster my_clu including tables cascade constraints ;--同时删除外键约束 

注:簇表可以像普通表一样删除。
3、清空簇
复制代码代码如下:

truncate cluster my_clu;

注:所有在此簇上的表的数据全部被清空
散列聚簇表
在簇表中,Oracle使用存储在索引中的键值来定位表中的行,而在散列聚簇表中,使用了散列函数代替了簇索引,先通过内部函数或者自定义的函数进行散列计算,然后再将计算得到的码值用于定位表中的行。创建散列簇需要用到HASHKEYS子句。
1、创建散列簇
复制代码代码如下:

    create cluster my_clu_two(empno number(10) ) 
    pctused 70 
    pctfree 10 
    tablespace users 
    hash is empno 
    hashkeys 150 ; 

说明:
* hash is 子句指明了进行散列的列,如果列是唯一的标示行,就可以将列指定为散列值
* hashkeys 指定和限制散列函数可以产生的唯一的散列值的数量
2、创建散列表
复制代码代码如下:

    create table t2_emp ( 
    empno number ( 10 ), 
    ename varchar2 ( 20 ), 
    birth_date date , 
    deptno number ) 
    cluster my_clu_two(empno); 

注意:
* 必须设置数值的精度
* 散列簇不能也不用创建索引
* 散列簇不能ALTER:size、hashkeys、hash is参数
不宜用聚簇表的情况
1)如果预料到聚簇中的表会大量修改,聚簇表会对DML的性能产生负面影响
2)非常不适合对单表的全表扫描,因为只能引起对其它表的全表扫描
3)频繁对表进行TRUNCATE和加载,因为聚簇中的表是不能TRUNCATE的,只能TRUNCATE簇
4)如果表只是偶尔被连接或者它们的公共列经常被修改,则不要聚簇表
5)如果经常从所有有相同聚簇键值的表查询出的结果数据超过一个或两个Oracle块,则不要聚簇表
6)如果空间不够,并且不能为将要插入的新记录分配额外的空间,那么不要使用聚簇


来自 https://m.xp.cn/b.php/77615.html


普通分类: