《Oracle Database Concepts 11g Release 2》讀書筆記(3)...

Table Cluster (P50-P55)算法

1. Table Cluster定義sql

Table Cluster 是指一組 table 在一個相同的 block 裏共享相同的列並存儲相關的內容。當一個table cluster 後,一個block將包含不一樣table中的row。例如,一個block包含的row 同時在employees departments中,而不只僅在某一單獨表中。數據庫

 

Cluster Key 是指被Cluster的表的列,例如employees departments所共享的列department_id,能夠在建立Cluster時或將新的 table 添加到 Cluster時指定 Cluster Keyoracle

 

Cluster Key Value 指的是被指定爲 Cluster Key 的列的指定的行集的值。全部包含相同Cluster Key value 的數據,其物理存儲都是在一塊兒的。不管有多少個表的行集包含該值,每一個cluster Key Value cluster cluster index 中只存儲一次。優化

 

若是有好幾個表被常常用於查詢(特別是多表查詢或join查詢)查詢,那就應該考慮使用 cluster table,由於Table Cluster將不一樣表中的相關行存儲在相同的block裏,適當的使用 cluster table能夠帶來如下好處:spa

1)減小clustered tables 之間進行join查詢的磁盤 I/O.net

2)減小 clustered tables之間進行join查詢的讀取時間code

3)更少的存儲空間,由於 cluster key value 只會存儲一次排序

 

Cluster table 在如下狀況時不該被使用:ip

1)表的多數訪問都是單獨查詢

2)表常常被 update

3)表常常須要 full table scan

4)表須要 truncating

 

2. Indexed Cluster 定義

Indexed Cluster 是一個使用index來定位數據的table cluster,是一個創建在Cluster Key 上的B-tree IndexCluster Index必須在 table cluster 填入數據前創建。

 

以下例,以department_id cluster key來創建名爲 employees_departments_clustercluster 因爲定義的時候未聲明爲 HASHKEYS cluster 因此這個cluster是一個indexted cluster;接下來,咱們在這個cluster key上建一個名字爲idx_emp_dept_clusterindex

例:

CRATE CLUSTER employees_departments_cluster

   (department_id NUMBER(4))

SIZE 512;

 

CREATE INDEX idx_emp_dept_cluster ON CLUSTER employees_departments_cluster;

接下來在cluster上創建employeesdepartments兩個表,同時聲明departnemt_id列爲cluster key
例:

CREATE TABLE employees(…)

         CLUSTER employees_departments_cluster(department_id);

 

CREATE TABLE departments(…)

CLUSTER employees_departments_cluster(department_id);

最後,在你往employeesdepartments裏添加數據時,數據庫會將employeesdepartments兩個表中的每一個department對應的全部行存儲在相同的data block裏。這些行被存儲在heap裏並以index來進行定位。

 

下圖展現了employees_departments_cluster的存儲結構,數據庫將department20110employee存儲到一塊兒.

 

clip_image002[4]

B-tree Cluster Index 是以存儲數據的block的物理地址來關聯cluster key value.例如,如下地址:
20,AADAAAA9d

表明了存儲department 20中的employeeblock的地址
.

 

Cluster Index 是被單獨管理的,nonclustered table上創建的index同樣,並能夠與table cluster存在於不一樣表空間之中.

 

若是employeesdepartments兩個表沒有定義爲table cluster,那麼數據庫將不能保證這

相關聯的行會被存儲到一塊兒.以下圖所示:

clip_image004[4]

 

3.Hash Clusters定義

Hash Clusterindexed cluster相似,只不過index keyhash function所替換,沒有單獨存在的cluster index.在一個hash cluster,數據就是index.

 

Hash clusterkeyindexted clusterkey同樣,都是一個單一列或組合關鍵字段.oracle database根據特定的cluster key values,使用一個hash function來產生一系列被稱爲hash key 的整數.數據庫將cluster key hash到一個data block的物理地址.數據庫將有相同key value的行存儲到一塊兒.

在一個indexed tableindex cluster,oracle使用存放在一個獨立index中的key value來定位數據庫中的行.indexed tableindexed cluster中查找或存儲一行,最少須要通過兩次I/O:

1) 至少一次I/O來在index中查找key value或在index中存儲key value

2) 一次I/O來讀或寫tablecluster中的行

 

爲了在hash cluster中查找或存儲一行數據,oracle爲每行的cluster key value提供了hash function. Oracle數據庫 Hash function的計算結果對應到cluster中的data block, 並對其進行讀寫.

 

Hashing是在存儲數據時用於提升數據檢索速度的一種方法,當如下條件知足時,能夠考慮使用hash cluster:

1) 一個表被用於query多於modify

2) hash key所在列常常被使用等於關係進行查詢, WHERE department_id=20. 對於這個查詢,若是 cluster key value已經hash,那麼hash key value將直接指向存儲相應行的block.

3) 一個表中的行數是能夠被合理的計算出來的(用於定義 hash function)

 

 

4. Hash cluster creation

創建一個hash cluster,除了使用 CREATE CLUSTER來建立indexed cluster,還須要添加HASHKEY關鍵字,以下例:

 

CREATE CLUSTER employees_departments_cluster

   (department_id NUMBER(4))

SIZE 8192 HASHKEYS 100;

 

以上, department_id被定義爲hash key,在這個例子中HASHKEY聲明瞭department有可能的數目(通常部門數都是能夠計算出來的,也就是說表中的行數是能夠計算出來的,知足上面的第3個條件).

 

在這個方案中,用戶常常執行的查詢以下所示,經過輸入不一樣的p_id來查詢不一樣的department ID

:

SELECT * FROM employees

WHERE department_id = :pid

 

SELECT * FROM departments

WHERE department_id = :pid

 

SELECT * FROM departments d, employees e

WHERE e.department_id=d.department_id

AND d.department_id = :pid

假設用戶常常以department_id20來執行第一個查詢, oracle數據庫使用20來當成hash function的輸入參數,並定位到存儲全部在編號爲20department中的employeeblock.

clip_image006[4]

上圖將一個hash cluster segment以一行blocks的形式展現出來,因而可知,每次數據檢索都只須要一次I/O.

 

Hash Cluster的侷限在於:

1) 其不適用於在nonindexed cluster key上進行range scan(區間搜索)

:

CREATE CLUSTER employees_departments_cluster

   (department_id NUMBER(4))

SIZE 8192 HASHKEYS 100;

若是以上代碼建立的hash cluster上不存在獨立的index,那麼查詢位於20100department_id將不能使用hash算法,由於他不能對20100之間的每個可能值進行hash.

由於不存在index,則數據庫須要進行full scan.

 

 

5. Hash Cluster Variations

Single-table hash cluster是一個優化過的,僅支持一個tablehash cluster.在這裏,hash key 到行的映射是一一對應的,當用戶須要對單表經過主鍵進行快速訪問時,使用sing-table hash cluster是合適的.例如,用戶常常會在employees表裏經過employee_id查找employee相關記錄.

 

Sorted hash clusterhash cluster的一個變種,其內的全部與hash結果相一致的行都已根據指定的列進行升序排序. Sorted hash cluster 容許應用程序對數據進行快速檢索,由於數據在插入時已經排好序.例如,一個包含orders表的hash cluster 能夠根據 order_date 進行排序.

 

 

6. Hash Cluster Storage

Oracle Databasehash cluster的空間分配與index cluster是不同的.database根據建立cluster的語句裏的SIZEHASHKEYS的乘積得出一個結果.並以字節爲單位預分配與此結果一致的空間.

:

CREATE CLUSTER employees_departments_cluster

   (department_id NUMBER(4))

SIZE 8192 HASHKEYS 100;

 

在上例中

,HASHKEYS聲明瞭有可能存在的department,SIZE聲明瞭每一個department全部數據所佔的空間大小.

 

在一個hash cluster,HASHKEYS的值是固定的.Oracle database並不會根據HASHKEYS來限制在table中能夠插入的值,但若是插入的數據遠大玩HASHKEYS的值,,hash cluster的檢索效率就會降低,這時應該使用新的HASHKEYS來重建hash cluster.

相關文章
相關標籤/搜索