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.如果空間不夠,並且不能為將要插入的新紀錄分配額外的空間,那麽不要使用簇
oracle聚簇表的理解 (轉自:https://blog.csdn.net/gumengkai/article/details/51009345 )