CLUSTER(7) SQL Commands CLUSTER(7)

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

CLUSTER indexname ON tablename
CLUSTER tablename
CLUSTER

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


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


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

沒有任何引數的 CLUSTER 將導致當前資料庫裡所有呼叫它的使用者所有的表都被建簇。 (絕不會對不包括進來的表建簇。)這種形式的 CLUSTER 不能在一個事務或者函數里面呼叫。


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


一個索引名稱。

準備建簇的表的名稱(可能有模式修飾)。


如果你只是隨機的訪問表中的行, 那麼在堆表中的資料的實際儲存順序是無關緊要的。 但是,如果你對某些資料的訪問多於其他資料, 而且有一個索引將這些資料分組,那你就將從使用 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,約束,外來鍵關係, 賦予的許可權,以及表的其它附屬的屬性 ---- 所有這些屬性都必須手工重建。


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

CLUSTER emp_ind ON emp;


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

CLUSTER emp;


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

CLUSTER;


在 SQL 標準裡沒有 CLUSTER 語句。

clusterdb [clusterdb(1)]

譯者

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

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

2003-11-02 SQL - Language Statements