CLUSTER

名稱

CLUSTER ─ 向伺服器給出儲存建簇的建議
 

語法

CLUSTER indexname ON table

輸入

indexname
一個索引名稱。
table
表的名稱。

輸出

CLUSTER
成功建簇。
ERROR: relation <tablerelation_number> inherits "table"
表 tablerelation_number 是從表 "table"繼承來的
ERROR: Relation table does not exist!
table 不存在

描述

CLUSTER 指示 Postgres 近似地基於索引 indexname 的度量對表 table 進行儲存建簇。索引必須已經在表 table 上定義了。

當對一個表建簇後,該表的物理儲存將基於索引資訊進行。建簇是靜態的,也就是說,當表被更新後,改變的內容不會建簇。不會試圖對更新過的記錄重新建簇。如果需要,可以通過手工執行該命令的方法重建簇。

注意

該表實際上按索引順序拷貝到了一個臨時表中,然後重新改成原名。因此,在建簇時所有賦予的權限和其它索引都將丟失。

如果你只是隨機的訪問表中的行,那麼在堆表中的數據的實際儲存順序是無關緊要的。但是,如果你對某些數據的訪問多於其他數據,而且有一個索引將這些數據分組,那你就將從 CLUSTER 中獲益。

另一個 CLUSTER 很有幫助的例子是當你用索引從一個表中取出幾個記錄時.如果你從一個表中請求一定索引範圍的值,或者是一個索引過的值對應多行,CLUSTER 也會有助於應用,因為如果索引標識出第一匹配行所在的堆儲存頁,所有其他行也可能已經在同一堆儲存頁裡了,這樣便節省了硬碟訪問的時間,加速了查詢。

有兩種建簇的數據。第一種是用 CLUSTER 命令,此命令將原表按你聲明的索引重新排列。這個動作在操作大表時可能會很慢,因為每一行都從堆儲存頁裡按索引順序取出,如果儲存頁表沒有排序,整個表是隨機存放在各個頁面的,因而每行都要進行依次硬碟頁面操作。Postgres 有一個緩沖,但一個大表的主體是不可能都放到緩沖去的。

另一個對數據建簇的方法是使用

SELECT columnlist INTO TABLE newtable
     FROM table ORDER BY columnlist
這個用法使用 Postgres 排序的程式碼 ORDER BY 來匹配索引,在對未排序的數據操作時速度快得多。然後你可以刪除舊表,用 ALTER TABLE/RENAMEtemp 改成舊表名,並且重建所有索引。唯一的問題是 OID 將不保留。這時再做 CLUSTER 將快得多,因為大多數堆疊數據已經排過序了而且使用現有的索引。

用法

以雇員的薪水屬性對雇員關系建簇。
CLUSTER emp_ind ON emp;

兼容性

SQL92

在 SQL92 規範裡沒有 CLUSTER 語句。