【对象管理】cluster

来源:互联网 发布:sql链接服务器 编辑:程序博客网 时间:2024/04/29 06:23

       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  2147483645INDEX     N      DISABLED
-----通过查看user_clu_columns我们可以看到该cluster中有两个表。
SQL> select * from user_clu_columns;CLUST CLU_COLUMN TABLE TAB_COLUMN----- ---------- ----- ----------TT    PROD_ID    TT1   PROD_IDTT    PROD_ID    TT2   PROD_ID
3、修改cluster

      可以通过alter cluster来修改下面三种参数:

1、物理属性(initrans和storage parameter)

2、SIZE(分配给每个cluster key的字节空间)
3、并发度

-----修改cluster key sizeSQL> 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==$0TT    PROD_ID    TT2   PROD_IDSQL> 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;--若是外键表,则连带删除外键表。

原创粉丝点击