table of contents
CLUSTER(7) | SQL Commands | 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
2003-11-02 | SQL - Language Statements |