簇的管理
簇是由共享相同数据块的一组表组成的。因为这些表共享公共的列并且经常一起被使用,所以将这些表组合在一起。因为使用簇将不同表的相关行一起存储到相同的数据块,所以可以有以下的好处:
1、减少磁盘I/O,并改善访问簇表的联结所花的时间。
2、每个簇键值在簇和簇索引中仅存储一次。
一、管理簇的准则
1、为簇选择合适的表
需要使用簇的表一般满足以下条件:
* 表主要被查询 (即表不总是被插入或更改)
* 表中的记录经常被一起或联结查询
2、为簇键选择合适的列
一般来说,好的簇键具有足够的唯一值,以便相应于每个键值的行的组大概会填充同一个数据块。
每个簇键值的行太少了就会浪费空间,并导致一点性能损失。而当每个簇键值的行太多时就可能会导致额外的搜索以发现该键的行,可能会造成比没有成簇时更差的性能。
另注:簇索引不能是唯一的或包含一个long类型的列。
3、指定数据块空间使用
通过在创建簇时指定PCTUSED和PCTFREE参数,可以影响空间的利用。
4、指定平均簇键及其相关的行所需的空间
CREATE CLUSTER语句有一个可选的参数——SIZE。它是一个估计的平均簇键及其相关行所需的字节数。Oracle在执行如下任务时使用SIZE参数:
* 估计可以填充到簇数据块的簇键(及其相关的行)的数量时
* 限制放置到簇数据块中的簇键的数量时
注:SIZE不限制簇键可以使用的空间,只是一个估算值。
5、指定每个簇和簇索引行的位置
可以在CREATE CLUSTER/INDEX 语句中指定TABLESPACE 以指定其不同的位置。将簇和簇索引创建在不同的存储设备上的不同表空间,可以减少磁盘竞争而同步得检索表数据和索引数据。
6、估计簇大小和设备存储参数
在创建簇之前就估算簇的大小有以下好处:
* 可以估算出所需磁盘空间,以确定合适的硬件选择
* 估算单个簇的大小,以便更好得管理簇要使用的空间,设置存储参数,改善I/O性能
二、创建簇
1、创建簇
CREATE CLUSTER emp_dept (deptno NUMBER(3))
PCTUSED 80
PCTFREE 5
TABLESPACE users
NEXT 300K
MINEXTENTS 2
MAXEXTENTS 20
PCTINCREASE 33);
注:本例没有INDEX子句,则会默认创建一个索引簇。
2、创建簇表
CREATE TABLE emp (
empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15) NOT NULL,
...
deptno NUMBER(3) REFERENCES dept)
CLUSTER emp_dept (deptno);
CREATE TEBLE dept (
deptno NUMBER(3) PRIMARY KEY,
...)
CLUSTER emp_dept (deptno);
注:可以将簇表和簇建立在不同的模式下,列名也不一定需要匹配,但是结构必须匹配。
3、创建簇索引
CREATE INDEX emp_dept_index
ON CLUSTER emp_dept
INITRANS 2
MAXTRANS 5
TABLESPACE users
STORAGE (INITIAL 50K
NEXT 50K
MINEXTENTS 2
MAXEXTENTS 10
PCTINCREASE 33)
PCTFREE 5;
三、更改簇
簇的以下设置可以被更改:
* 物理属性(PCTFREE、PCTUSED、INITRANS、MAXTRANS & STORAGE)
* 为存储簇键值的所有行所需空间的平均值(SIZE)
* 默认的并行度
另外,可明确地给簇分配新的盘区,或回收在簇的末端的任何未使用盘区。
ALTER CLUSTER emp_dept
PCTFREE 30
PCTUSED 60;
四、删除簇
删除不包含表的簇及其簇索引:
DROP CLUSTER emp_dept;
删除包含表的簇,并同时删除簇表:
DROP CLUSTER emp_dept INCLUDING TABLES;
--注:当簇包含簇表且未增加INCLUDING TABLES子句,则会报错
簇表中包含外键约束时:
DROP CLUSTER emp_dept INCLUDING TABLES CASCADE CONSTRAINTS;
--若存在约束且未使用CASCADE CONSTRAINTS子句,则会报错
删除簇表:
DROP TABLE xxx;
删除簇索引:
DROP INDEX xxx;
--注:簇索引虽然可以删除,但是没有簇索引就无法使用簇,所以一般在重建时才删除簇索引。
五、簇的相关信息
DBA|ALL|USER_CLUSTERS:数据库中所有簇的表述,包括DBMS_STATS包或ANALYZE语句产生的统计数据
DBA|USER_CLU_COLUMNS:将表列映射到簇列