什麼是聚簇
聚簇是根據碼值找到數據的物理存儲位置從而達到快速檢索數據的目的聚簇索引的順序就是數據的物理存儲順序葉節點就是數據節點非聚簇索引的順序與數據物理排列順序無關葉節點仍然是索引節點只不過有一個指針指向對應的數據塊一個表最多只能有一個聚簇索引
使用 Oracle 聚簇索引
聚簇是一種存儲表的方法這些表密切相關並經常一起連接進磁盤的同一區域例如表 BOOKSHELF 和BOOKSHELF_AUTHOR 數據行可以一起插入到稱為簇(Cluster)的單個區域中而不是將兩個表放在磁盤上的不同扇區上簇鍵(Cluster Key)可以是一列或多列通過這些列可以將這些表在查詢中連接起來(例如BOOKSHELF表和BOOKSHELF_AUTHOR表中的 Title列)為了將表聚集在一起必須擁有這些將要聚集在一起的表
下面是create cluster命令的基本格式
create cluster (column datatype [ column datatype]) [other options];
cluster的名字遵循表命名約定column datatype是將作為簇鍵使用的名字和數據類型column的名字可以與將要放進該簇中的表的一個列名相同或者為其他有效名字下面是一個例子
create cluster BOOKandAUTHOR (Col VARCHAR());
這樣就建立了一個沒有任何內容的簇(象給表分配了一塊空間一樣)COL的使用對於簇鍵是不相干的不會再使用它但是它的定義應該與要增加的表的主鍵相符接下來建立包含在該簇中的表
create table BOOKSHELF
(Title VARCHAR() primary key
Publisher VARCHAR()
CategoryName VARCHAR()
Rating VARCHAR()
constraint CATFK foreign key (CategoryName) references CATEGORY(CategoryName)
)
cluster BOOKandAUTHOR(Title);
在向BOOKSHELF表中插入數據行之前必須建立一個聚簇索引
create index BOOKandAUTHORndx on cluster BOOKandAUTHOR;
在上面的create table語句中簇BOOKandAUTHOR(Title)子句放在表的列清單的閉括號的後面BOOKandAUTHOR是前面建立的聚簇的名字Title是將存儲到聚簇Col中的該表的列create cluster語句中可能會有多個簇鍵並且在created table語句中可能有多個列存儲在這些鍵中請注意沒有任何語句明確說明Title列進入到Col中這種匹配僅僅是通過位置做到的即Col和Title都是在它們各自的簇語句中提到的第一個對象多個列和簇鍵是第一個與第一個匹配第二個與第二個匹配第三個與第三個匹配等等現在添加第二個表到聚簇中
create table BOOKSHELF_AUTHOR
(Title VARCHAR()
AuthorName VARCHAR()
constraint TitleFK Foreign key (Title) references BOOKSHELF(Title)
constraint AuthorNameFK Foreign key (AuthorName) references AUTHOR(AuthorName)
)
cluster BOOKandAUTHOR (Title);
當這兩個表被聚在一起時每個唯一的Title在簇中實際只存儲一次對於每個Title都從這兩個表中附加列
來自這兩個表的數據實際上存放在一個位置上就好像簇是一個包含兩個表中的所有數據的大表一樣
散列聚簇
對於散列聚簇它只有一個表它通過散列算法求出存儲行的物理存儲位置從而快速檢索數據創建散列聚簇時要指定碼列的數據類型數據行的大小及不同碼值的個數如果碼值不是平均分布的就可能有許多行存儲到溢出塊上從而會降低查詢該表的SQL語句的性能
散列聚簇被用在總是通過主鍵查詢數據的情況例如要從表 T 查詢數據並且查詢語句總是是這樣
select * from T where id = :x;
這時散列聚簇是一個好的選擇因為不需要索引Oracle 將通過散列算法得到值 :x 所對應的物理地址從而直接取到數據不用進行索引掃描只通過散列值進行一次表訪問
散列聚簇語法示例
CREATE CLUSTER personnel
( department_number NUMBER )
SIZE HASHKEYS
STORAGE (INITIAL K NEXT K);
CREATE CLUSTER personnel
( home_area_code NUMBER
home_prefix NUMBER )
HASHKEYS
HASH IS MOD(home_area_code + home_prefix );
CREATE CLUSTER personnel
(deptno NUMBER)
SIZE SINGLE TABLE HASHKEYS ;
From:http://tw.wingwit.com/Article/program/Oracle/201311/18689.html