簇的管理
?
??? 簇是由共享相同數(shù)據(jù)塊的一組表組成的。因?yàn)檫@些表共享公共的列并且經(jīng)常一起被使用,所以將這些表組合在一起。因?yàn)槭褂么貙⒉煌淼南嚓P(guān)行一起存儲(chǔ)到相同的數(shù)據(jù)塊,所以可以有以下的好處:
?
??? 1、減少磁盤I/O,并改善訪問簇表的聯(lián)結(jié)所花的時(shí)間。
??? 2、每個(gè)簇鍵值在簇和簇索引中僅存儲(chǔ)一次。
?
???
?
?
一、管理簇的準(zhǔn)則
?
1、為簇選擇合適的表
?
??? 需要使用簇的表一般滿足以下條件:
?
??? * 表主要被查詢 (即表不總是被插入或更改)
??? * 表中的記錄經(jīng)常被一起或聯(lián)結(jié)查詢
?
2、為簇鍵選擇合適的列
?
??? 一般來說,好的簇鍵具有足夠的唯一值,以便相應(yīng)于每個(gè)鍵值的行的組大概會(huì)填充同一個(gè)數(shù)據(jù)塊。
??? 每個(gè)簇鍵值的行太少了就會(huì)浪費(fèi)空間,并導(dǎo)致一點(diǎn)性能損失。而當(dāng)每個(gè)簇鍵值的行太多時(shí)就可能會(huì)導(dǎo)致額外的搜索以發(fā)現(xiàn)該鍵的行,可能會(huì)造成比沒有成簇時(shí)更差的性能。
?
??? 另注:簇索引不能是唯一的或包含一個(gè)long類型的列。
?
3、指定數(shù)據(jù)塊空間使用
?
??? 通過在創(chuàng)建簇時(shí)指定PCTUSED和PCTFREE參數(shù),可以影響空間的利用。
?
4、指定平均簇鍵及其相關(guān)的行所需的空間
?
??? CREATE CLUSTER語句有一個(gè)可選的參數(shù)——SIZE。它是一個(gè)估計(jì)的平均簇鍵及其相關(guān)行所需的字節(jié)數(shù)。Oracle在執(zhí)行如下任務(wù)時(shí)使用SIZE參數(shù):
?
??? * 估計(jì)可以填充到簇?cái)?shù)據(jù)塊的簇鍵(及其相關(guān)的行)的數(shù)量時(shí)
??? * 限制放置到簇?cái)?shù)據(jù)塊中的簇鍵的數(shù)量時(shí)
?
??? 注:SIZE不限制簇鍵可以使用的空間,只是一個(gè)估算值。
?
5、指定每個(gè)簇和簇索引行的位置
?
??? 可以在CREATE CLUSTER/INDEX 語句中指定TABLESPACE 以指定其不同的位置。將簇和簇索引創(chuàng)建在不同的存儲(chǔ)設(shè)備上的不同表空間,可以減少磁盤競(jìng)爭(zhēng)而同步得檢索表數(shù)據(jù)和索引數(shù)據(jù)。
?
6、估計(jì)簇大小和設(shè)備存儲(chǔ)參數(shù)
?
??? 在創(chuàng)建簇之前就估算簇的大小有以下好處:
?
??? * 可以估算出所需磁盤空間,以確定合適的硬件選擇
??? * 估算單個(gè)簇的大小,以便更好得管理簇要使用的空間,設(shè)置存儲(chǔ)參數(shù),改善I/O性能
?
?
二、創(chuàng)建簇
?
1、創(chuàng)建簇
?
??? CREATE CLUSTER emp_dept (deptno NUMBER(3))
??? PCTUSED 80
??? PCTFREE 5
??? TABLESPACE users
??? NEXT 300K
??? MINEXTENTS 2
??? MAXEXTENTS 20
??? PCTINCREASE 33);
?
??? 注:本例沒有INDEX子句,則會(huì)默認(rèn)創(chuàng)建一個(gè)索引簇。
?
2、創(chuàng)建簇表
?
??? 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);
?
??? 注:可以將簇表和簇建立在不同的模式下,列名也不一定需要匹配,但是結(jié)構(gòu)必須匹配。
?
3、創(chuàng)建簇索引
?
??? 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;
?
?
三、更改簇
?
??? 簇的以下設(shè)置可以被更改:
?
??? * 物理屬性(PCTFREE、PCTUSED、INITRANS、MAXTRANS & STORAGE)
??? * 為存儲(chǔ)簇鍵值的所有行所需空間的平均值(SIZE)
??? * 默認(rèn)的并行度
?
??? 另外,可明確地給簇分配新的盤區(qū),或回收在簇的末端的任何未使用盤區(qū)。
?
??? ALTER CLUSTER emp_dept
??? PCTFREE 30
??? PCTUSED 60;
?
?
四、刪除簇
?
??? 刪除不包含表的簇及其簇索引:
??? DROP CLUSTER emp_dept;
?
??? 刪除包含表的簇,并同時(shí)刪除簇表:
??? DROP CLUSTER emp_dept INCLUDING TABLES;
??? --注:當(dāng)簇包含簇表且未增加INCLUDING TABLES子句,則會(huì)報(bào)錯(cuò)
?
??? 簇表中包含外鍵約束時(shí):
??? DROP CLUSTER emp_dept INCLUDING TABLES CASCADE CONSTRAINTS;
??? --若存在約束且未使用CASCADE CONSTRAINTS子句,則會(huì)報(bào)錯(cuò)
?
??? 刪除簇表:
??? DROP TABLE xxx;
?
??? 刪除簇索引:
??? DROP INDEX xxx;
??? --注:簇索引雖然可以刪除,但是沒有簇索引就無法使用簇,所以一般在重建時(shí)才刪除簇索引。
?
?
五、簇的相關(guān)信息
?
??? DBA|ALL|USER_CLUSTERS:數(shù)據(jù)庫(kù)中所有簇的表述,包括DBMS_STATS包或ANALYZE語句產(chǎn)生的統(tǒng)計(jì)數(shù)據(jù)
??? DBA|USER_CLU_COLUMNS:將表列映射到簇列
?
?