簇的管理
?
??? 簇是由共享相同數據塊的一組表組成的。因為這些表共享公共的列并且經常一起被使用,所以將這些表組合在一起。因為使用簇將不同表的相關行一起存儲到相同的數據塊,所以可以有以下的好處:
?
??? 1、減少磁盤I/O,并改善訪問簇表的聯結所花的時間。
??? 2、每個簇鍵值在簇和簇索引中僅存儲一次。
?
?
?
一、管理簇的準則
?
1、為簇選擇合適的表
?
??? 需要使用簇的表一般滿足以下條件:
?
??? * 表主要被查詢 (即表不總是被插入或更改)
??? * 表中的記錄經常被一起或聯結查詢
?
2、為簇鍵選擇合適的列
?
??? 一般來說,好的簇鍵具有足夠的唯一值,以便相應于每個鍵值的行的組大概會填充同一個數據塊。
??? 每個簇鍵值的行太少了就會浪費空間,并導致一點性能損失。而當每個簇鍵值的行太多時就可能會導致額外的搜索以發現該鍵的行,可能會造成比沒有成簇時更差的性能。
?
??? 另注:簇索引不能是唯一的或包含一個long類型的列。
?
3、指定數據塊空間使用
?
??? 通過在創建簇時指定PCTUSED和PCTFREE參數,可以影響空間的利用。
?
4、指定平均簇鍵及其相關的行所需的空間
?
??? CREATE CLUSTER語句有一個可選的參數——SIZE。它是一個估計的平均簇鍵及其相關行所需的字節數。Oracle在執行如下任務時使用SIZE參數:
?
??? * 估計可以填充到簇數據塊的簇鍵(及其相關的行)的數量時
??? * 限制放置到簇數據塊中的簇鍵的數量時
?
??? 注:SIZE不限制簇鍵可以使用的空間,只是一個估算值。
?
5、指定每個簇和簇索引行的位置
?
??? 可以在CREATE CLUSTER/INDEX 語句中指定TABLESPACE 以指定其不同的位置。將簇和簇索引創建在不同的存儲設備上的不同表空間,可以減少磁盤競爭而同步得檢索表數據和索引數據。
?
6、估計簇大小和設備存儲參數
?
??? 在創建簇之前就估算簇的大小有以下好處:
?
??? * 可以估算出所需磁盤空間,以確定合適的硬件選擇
??? * 估算單個簇的大小,以便更好得管理簇要使用的空間,設置存儲參數,改善I/O性能
?
?
二、創建簇
?
1、創建簇
?
??? CREATE CLUSTER emp_dept (deptno NUMBER(3))
??? PCTUSED 80
??? PCTFREE 5
??? TABLESPACE users
??? NEXT 300K
??? MINEXTENTS 2
??? MAXEXTENTS 20
??? PCTINCREASE 33);
?
??? 注:本例沒有INDEX子句,則會默認創建一個索引簇。
?
2、創建簇表
?
??? CREATE TABLE emp (
??? empno NUMBER(5) PRIMARY KEY,
??? ename VARCHAR2(15) NOT NULL,
??? ...
??? deptno NUMBER(3) REFERENCES dept)
??? CLUSTER emp_dept (deptno);
?
??? CREATE TEBLE dept (
??? deptno NUMBER(3) PRIMARY KEY,
...)
??? CLUSTER emp_dept (deptno);
?
??? 注:可以將簇表和簇建立在不同的模式下,列名也不一定需要匹配,但是結構必須匹配。
?
3、創建簇索引
?
??? CREATE INDEX emp_dept_index
??? ON CLUSTER emp_dept
??? INITRANS 2
??? MAXTRANS 5
??? TABLESPACE users
??? STORAGE (INITIAL 50K
??? NEXT 50K
??? MINEXTENTS 2
??? MAXEXTENTS 10
??? PCTINCREASE 33)
??? PCTFREE 5;
?
?
三、更改簇
?
??? 簇的以下設置可以被更改:
?
??? * 物理屬性(PCTFREE、PCTUSED、INITRANS、MAXTRANS & STORAGE)
??? * 為存儲簇鍵值的所有行所需空間的平均值(SIZE)
??? * 默認的并行度
?
??? 另外,可明確地給簇分配新的盤區,或回收在簇的末端的任何未使用盤區。
?
??? ALTER CLUSTER emp_dept
??? PCTFREE 30
??? PCTUSED 60;
?
?
四、刪除簇
?
??? 刪除不包含表的簇及其簇索引:
??? DROP CLUSTER emp_dept;
?
??? 刪除包含表的簇,并同時刪除簇表:
??? DROP CLUSTER emp_dept INCLUDING TABLES;
??? --注:當簇包含簇表且未增加INCLUDING TABLES子句,則會報錯
?
??? 簇表中包含外鍵約束時:
??? DROP CLUSTER emp_dept INCLUDING TABLES CASCADE CONSTRAINTS;
??? --若存在約束且未使用CASCADE CONSTRAINTS子句,則會報錯
?
??? 刪除簇表:
??? DROP TABLE xxx;
?
??? 刪除簇索引:
??? DROP INDEX xxx;
??? --注:簇索引雖然可以刪除,但是沒有簇索引就無法使用簇,所以一般在重建時才刪除簇索引。
?
?
五、簇的相關信息
?
??? DBA|ALL|USER_CLUSTERS:數據庫中所有簇的表述,包括DBMS_STATS包或ANALYZE語句產生的統計數據
??? DBA|USER_CLU_COLUMNS:將表列映射到簇列
?
?