CLUSTER(7)

NAME
CLUSTER - 根據一個索引對某個表集簇

SYNOPSIS

CLUSTER indexname ON tablename
CLUSTER tablename
CLUSTER

DESCRIPTION 描述

CLUSTER 指示PostgreSQL 基於索引 indexname 的度量對錶 table 進行存儲建簇。索引必須已經在表 tablename. 上定義。

 當對一個表建簇後，該表的物理存儲將基於索引信息進行。 建簇是一次性操作：也就是說，當表隨後被更新後，改變的內容不會建簇。 也就是說，系統不會試圖按照索引順序對更新過的記錄重新建簇。 如果需要，可以通過週期性地手工執行該命令的方法重建簇。

 在對一個表建簇之後，PostgreSQL 會記憶在哪個索引上建立的簇。 CLUSTER tablename 的形式就在表以前建簇的同一個索引上建簇。

沒有任何參數的 CLUSTER 將導致當前數據庫裏所有調用它的用戶所有的表都被建簇。 （絕不會對不包括進來的表建簇。）這種形式的 CLUSTER 不能在一個事務或者函數裏面調用。

 在對一個表進行建簇的時候，則在其上請求一個 ACCESS EXCLUSIVE 鎖。 這樣就避免了在 CLUSTER 完成之前執行任何其他的數據庫操作（包括讀寫）。 參閱 Section 12.3 獲取有關數據庫鎖定的更多信息。

PARAMETERS 參數

indexname
     一個索引名稱。

tablename
     準備建簇的表的名稱（可能有模式修飾）。

NOTES 注意

 如果你只是隨機的訪問表中的行， 那麼在堆表中的數據的實際存儲順序是無關緊要的。 但是，如果你對某些數據的訪問多於其他數據， 而且有一個索引將這些數據分組，那你就將從使用 CLUSTER 中獲益。 如果你從一個表中請求一定索引範圍的值， 或者是一個索引過的值對應多行， CLUSTER 也會有助於應用， 因爲如果索引標識出第一匹配行所在的堆存儲頁，所有其他行也可能已經在同一堆存儲頁裏了， 這樣便節省了磁盤訪問的時間，加速了查詢。

 在這個建簇的操作過程中，系統先創建一個按照索引順序建立的表的臨時拷貝。 同時也建立表上的每個索引的臨時拷貝。因此，你需要磁盤上有足夠的剩餘空間， 至少是表大小和索引大小的和。

 因爲 CLUSTER 記憶建簇信息，我們可以在第一次的時候手工對錶進行建簇， 然後設置一個類似 VACUUM 的時間， 這樣我們就可以週期地自動對錶進行建簇了。

 因爲規劃器記錄着有關表的排序的統計，所以我們建議在新近建簇的表上運行 ANALYZE。 否則，規劃器可能會選擇很差勁的查詢規劃。

 還有一種建簇的方法。 CLUSTER 命令將原表按你聲明的索引重新排列。 這個動作在操作大表時可能會很慢， 因爲每一行都從堆存儲頁裏按索引順序取出，如果存儲頁表沒有排序， 整個表是隨機存放在各個頁面的，因而移動的每一行都要進行一次磁盤頁面操作。 PostgreSQL 有一個緩衝， 但一個大表的主體是不可能都放到緩衝去的。 另外一種對錶建簇的方法是

CREATE TABLE newtable AS
    SELECT columnlist FROM table ORDER BY columnlist;

 這個用法使用PostgreSQL 排序的代碼 ORDER BY 來創建一個需要的順序，在對未排序的數據操作時通常速度比索引掃描快得多。 然後你可以刪除舊錶，用 ALTER TABLE ... RENAME將 newtable 改成舊錶名， 並且重建該表所有索引。但是，這個方法不保留 OID，約束，外鍵關係， 賦予的權限，以及表的其它附屬的屬性 ---- 所有這些屬性都必須手工重建。

EXAMPLES 例子

 以僱員的 emp_ind 屬性對employees關係建簇。

CLUSTER emp_ind ON emp;

 使用以前用過的同一個索引對employees表進行建簇：

CLUSTER emp;

 對以前建過簇的所有表進行建簇：

CLUSTER;

COMPATIBILITY 兼容性

 在 SQL 標準裏沒有 CLUSTER 語句。

SEE ALSO 參見
clusterdb [clusterdb(1)]

譯者
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>

跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh