您的位置:首页 > 数据库 > Oracle

Oracle簇表介绍 (clustered table)

2013-04-02 00:55 162 查看
簇表概述

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

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



如上图,在1个簇表内,不同表的相关(related)数据行会被存储到1个Data Block中,因此有如下优点:

* 连接(join) 簇表所需的磁盘I/O减少。

* 连接簇表时间减少

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

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

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

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

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

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

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

先检查当前环境



可以看出当前用户是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个簇



创建后可以通过查看user_clusters 来检索这个簇.



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

簇索引的作用
用于1个簇键值并返回该簇键值的地址块. (注意簇中,每1个簇键值只存储1次啊)

语法:
Create index emp_dept_cluster_idx
on cluster emp_dept_cluster


创建后可以查看user_indexse来检索这个簇索引



创建簇表
创建簇表 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来检索这两张簇表



也可以从user_objects视图里查看:



上图两个SYS开头的index是建立主键时系统自动建立的indexes.

下面对CL_DEPT 和 CL_EMP 插入数据. 从scott帐号的表导入



记得commit;..

更改簇属性

类似table
可以用如下语句更改簇属性
Alter Cluster EMP_DEPT_CLUSTER
pctree 20;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: