1. 程式人生 > >oracle聚簇表的理解 (轉自:https://blog.csdn.net/gumengkai/article/details/51009345 )

oracle聚簇表的理解 (轉自:https://blog.csdn.net/gumengkai/article/details/51009345 )

Oracle支援兩種型別的聚簇:索引聚簇和雜湊聚簇

一.索引聚簇表的原理

聚簇:如果一些表有一些共同的列,則將這樣一組表儲存在相同的資料塊中

聚簇還表示把相關的資料儲存在同一個塊上。利用聚簇,一個塊可能包含多個表的資料。

概念上就是說如果兩個表或多個表經常做連線操作,就可以預先把需要的資料也儲存在一起。

聚簇還可以用於單個表,可以按某個列將資料分組儲存。

簡單的說,簇就是一組表,由一組共享相同資料塊的多個表組成,將經常一起使用的表組合在一起成簇

就可以提高處理效率。

二.使用方法

建立的順序:簇——>簇表——>簇索引——>資料

如下

a.建立簇

CREATE CLUSTER my_clu(
deptno NUMBER(10))
PCTUSED 60 
PCTFREE 10
SIZE 1024 --
TABLESPACE USERS
storage(
INITIAL 128k
NEXT 128k
MINEXTENTS 2
MAXEXTENTS 20
);

關於size選項:size為1024表示每個聚簇鍵關聯大約1024位元組的資料(1024對於一般的表一條資料沒問題)

oracle會用size這個設定來計算每個塊最多能放下多少個聚簇鍵。假設塊大小為8kb,oradcle會在每個資料塊

上放做多7個聚簇鍵,也就是說deptno為10-60的資料會放在一個塊上,一旦插入部門80,就會使用一個新塊,

存放的順序是和插入順序相關的。

size控制著每塊上聚簇鍵的最大個數。是對聚簇空間利用率影響最大的因素。如果size設定的過高,那麼每個塊

上的鍵就會很少(單位block可以存的聚簇鍵就少了),會導致不必要的使用過多的空間。如果設定的過低,又會

導致資料過分串鏈(一個聚簇鍵不夠存放一條資料),就與聚簇本來的目的不符,因為聚簇原本就是為了把相關

資料都儲存在一個塊上

b.建立簇表

CREATE TABLE t1_dept(
deptno NUMBER(10),
dname VARCHAR2(20))
CLUSTER my_clu(deptno);


CREATE TABLE t1_emp(
empno NUMBER,
ename VARCHAR2(20),
birth_date DATE,
deptno NUMBER(10))
CLUSTER my_clu(deptno);

此時如果直接查詢建立的表,將會出現提示

SELECT * FROM t1_dept; --聚簇表無法在索引建立之前使用

c.為簇建立索引

CREATE INDEX clu_index ON cluster my_clu;

j聚簇索引的任務是拿到一個聚簇鍵值,然後返回包含這個鍵的block的塊地址.實際上這是一個 主鍵

其中每個聚簇鍵值指向聚簇本身中的一個塊。因此,在請求deptno=10的資料時,oracle會讀取聚簇鍵

確定相應的塊地址,然後讀取資料

管理聚簇

a.對於簇的修改使用alter,需要具有alter any cluster的許可權

ALTER CLUSTER my_clu PCTUSED 40;
b.刪除簇

drop cluster my_clu: --僅適用於刪除空簇

drop cluster my_clu including tables;--刪除簇和簇表

drop cluster my_clu including tables cascade constraints;--同時刪除外來鍵約束

c.清空簇

truncate cluster my_clu;

注:所有在此簇上的表的資料全部被清空

三.載入資料

向聚簇表中載入資料需要使用合理的處理方法,否則會使得聚簇的功能發揮不完全,

降低查詢的效率

四.不宜使用簇的情況

1.如果預料到聚簇表會大量被修改,聚簇表會對dml的效能造成負面影響

2.非常不適合對單表的全表掃描,因為只能引起對其他表的全表掃描

3.頻繁對錶進行truncate操作,因為聚簇中的表是不能truncate的,只能清空(truncate)簇

4.如果簇只是歐惹人被連線或他們的公共列經常被吸怪,則不要聚簇表

5.如果經常從所有相同聚簇值得表查詢出的結果的資料超過一個或兩個oracle塊,則不要聚簇表

6.如果空間不夠,並且不能為將要插入的新紀錄分配額外的空間,那麼不要使用簇