Oracle的簇和簇表
簇由一组共享相同数据块的多个表组成,它将这些表的相关行一起存储到相同数据块中,这样可以减少查询数据所需的磁盘读取量。创建簇后,用户可以在簇中创建表,这些表成为簇表。
例如,scott用户中有一个员工信息表emp、部门信息表dept,这两个表共享部门编号deptno列。当将emp和dept表组成簇后,在物理上Oracle将emp和dept表中有关每个部门的所有员工信息和部门信息行存储到相同的数据块中。因为簇将不同表的相关行一起存储到相同的数据块中,所以合理使用簇可以帮助减少查询数据所需的磁盘读取量。而对于经常单独使用的表不应该使用簇。
创建簇
创建簇的语法形式如下:
CREATE CLUSTER cluster_name(COLUMN date_type[,COLUMN date_type]...)
[PCTUSED 40 | INTEGER]
[PCTFREE 10 | INTEGER]
[SIZE INTEGER]
[INITRANS 1 | INTEGER]
[MAXTRANS 255 | INTEGER]
[TABLESPACE tablespace_name]
[STORAGE storage]
例1:
以SYSDBA角色登录并赋予用户相关权限:
GRANT CREATE ANY CLUSTER TO siege;
然后创建簇:
CREATE CLUSTER cluster_student(sid NUMBER(4))
PCTUSED 40
PCTFREE 10
SIZE 1024
STORAGE (
INITIAL 128k
NEXT 128k
MINEXTENTS 2
MAXEXTENTS 20
)TABLESPACE learning;
创建簇表
创建好簇后,接下来创建簇表,在cluster_student簇中创建两个簇表:
CREATE TABLE score(
sid NUMBER(4),
sname VARCHAR2(10),
sscore NUMBER(4)
)CLUSTER cluster_student(sid)
CREATE TABLE student1(
sid NUMBER(4),
sname VARCHAR2(10),
sage NUMBER(4)
)CLUSTER cluster_student(sid)
管理簇
创建簇索引
在创建簇表以后,若直接插入数据会报ORA-02032错误,此时是因为未建立簇索引,建立簇索引如下:
CREATE INDEX cluster_student_index ON CLUSTER cluster_student TABLESPACE learning;
然后插入数据:
INSERT INTO student1 VALUES(1000,'siege',24);
此时就不会发生错误了。
更改簇信息
创建好的簇可以进行更改,如下:
ALTER CLUSTER cluster_student
PCTFREE 60
PCTUSED 50;
删除簇信息
删除簇与删除表的语法一致,若簇中含有簇表,则加上including tables子句
DROP CLUSTER cluste_name [INCLUDING TABLES]