cluster可以用来保存多个表的数据。cluster分为两种:
index cluster:
用索引来检索cluster key。不过需要注意的是,创建聚集的时候不会创建索引,需要在create cluster之后另外创建索引,否则在此之前不能对聚集表进行DML操作。
hash cluster:
利用散列函数来检索cluster key。不能对hash cluster 建立索引。
一、创建cluster
创建索引的时候需要注意,cluster key可以对应多个表的不同名称的列,但是这些列必须具有相同的数据类型和数据长度。同时,不能对cluster key建立constraint。另外,cluster 的storage参数、transaction参数等会覆盖table的对应参数。还有就是,创建索引需要create cluster的权限和表空间的quota。
1、查看用户权限。
SQL>grant create cluster to sh;---授予权限;
SQL> select * from user_sys_privs where privilege ='CREATE CLUSTER';---查询权限
USERNAME PRIVILEGE ADM
------------------------------ ---------------------------------------- ---
SH CREATE CLUSTER NO
2、创建cluster
----第一步,创建index cluster;
SQL>create cluster tt(
2 prod_id number)
3 size 512
4 storage(
5 initial 100k
6 next 50k);
此时并没有创建索引,如果现在往cluster 中添加表的话,就会报错:
SQL> create table tt1
2 cluster tt(prod_id) as
3 select * from sales where prod_id =13;
select * from sales where prod_id =13
*
ERROR at line 3:
ORA-02032: clustered tables cannot be used before the cluster index is built
另外创建索引的时候,需要注意的是索引是对所有的cluster key创建的,不能单独创建。否则会报错,从cluster index 的创建语法可以看出。
SQL> create index tt on cluster tt(prod_id);
create index tt on cluster tt(prod_id)
*
ERROR at line 1:
ORA-02158: invalid CREATE INDEX option
-----第二步,创建cluster index;
SQL> create index tt on cluster tt;
Index created.
然后,第三步就是往聚集中添加表。
SQL> create table tt1
2 cluster tt(prod_id)
3 as
4 select * from sales where prod_id =13;
Table created.
SQL> create table tt2
2 cluster tt(prod_id)
3 as
4 select * from sales where prod_id =15;
Table created.
最后,我们查看一下cluster tt在动态性能视图中的信息。
----通过user_clusters 我们可以看到创建cluster的时候的参数。
SQL> select cluster_name,pct_free,pct_used,key_size,ini_trans,max_trans,initial_extent,next_extent,min_extents,max_extents,pct_increase,cluster_type,single_table,dependencies from user_clusters where
2 cluster_name ='TT';
CLUSTER_NAME PCT_FREE PCT_USED KEY_SIZE INI_TRANS MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE
------------------------------ ---------- ---------- ---------- ---------- ---------- -------------- ----------- ----------- ----------- ------------
CLUST SINGLE_TAB DEPENDEN
----- ---------- --------
TT 10 512 2 255 106496 57344 1 2147483645
INDEX N DISABLED
-----通过查看user_clu_columns我们可以看到该cluster中有两个表。
SQL> select * from user_clu_columns;
CLUST CLU_COLUMN TABLE TAB_COLUMN
----- ---------- ----- ----------
TT PROD_ID TT1 PROD_ID
TT PROD_ID TT2 PROD_ID
3、修改cluster
可以通过alter cluster来修改下面三种参数:
1、物理属性(initrans和storage parameter)
2、SIZE(分配给每个cluster key的字节空间)
3、并发度
-----修改cluster key size
SQL> alter cluster tt size 560;
Cluster altered.
SQL> select cluster_name,key_size from user_clusters where cluster_name ='TT';
CLUST KEY_SIZE
----- ----------
TT 560
-----修改storage参数和parallel参数;
SQL> alter cluster tt storage(next 30k) parallel 3;
Cluster altered.
SQL> select cluster_name,next_extent,degree from user_clusters where cluster_name ='TT';
CLUST NEXT_EXTENT DEGREE
----- ----------- --------------------
TT 32768 3
另外需要注意的是,对于聚集表,alter table 不能修改该表对应上面的这些参数,否则会报错:ORA-01771,
illegal option for a clustered table。因为聚集表为了方便管理,必须覆盖所有聚集表的上面三种参数信息,以保持信息的一致性。为此,alter table 只能修改逻辑参数信息,如column的增删改操作、constraint的增删改操作等信息。
4、删除cluster
删除cluster table:
SQL> drop table tt1;
Table dropped.
----删除表TT1之后,会发现一个有趣的现象,就是user_clu_columns中依然有删除表的信息,只是名字改变罢了。
----显然这是表还在回收站中的缘故,清空一下回收站,然后再查看user_clu_columns,删除的表就不见了!
SQL> select * from user_clu_columns;
CLUST CLU_COLUMN TABLE TAB_COLUMN
----- ---------- ----- ----------
TT PROD_ID BIN$l PROD_ID
5irW+
YqREa
GPiS+
9tpLN
w==$0
TT PROD_ID TT2 PROD_ID
SQL> purge recyclebin;
Recyclebin purged.
SQL> select * from user_clu_columns;
CLUST CLU_COLUMN TABLE TAB_COLUMN
----- ---------- ----- ----------
TT PROD_ID TT2 PROD_ID
删除cluster index:
SQL>drop index tt;
删除cluster:
SQL>DROP CLUSTER TT;---只是删除聚集;
SQL>DROP CLUSTER TT INCLUDING TABLES CASCADE;----删除聚集的同时,删除聚集表;
SQL>DROP CLUSTER TT INCLUDING TABLES CASCADE CONSTRAINTS;--若是外键表,则连带删除外键表。