Provided by:
manpages-zh_1.5-1_all 
NAME
CLUSTER - 根據一荅薑瑐麍Y茠穚偭L
SYNOPSIS
CLUSTER indexname ON tablename
CLUSTER tablename
CLUSTER
DESCRIPTIONyz
CLUSTER 指示PostgreSQL 基於索引 indexname 的度量對表 table
進行存儲建簇。索引必須已經在表 tablename. 上定義。
當對一茠礅媮L後,該表的物理存儲將基於索引信息進行。
建簇是一次性操作:也就是說,當表隨後被更新後,改變的內容不會建簇。
也就是說,系統不會試圖按照索引順序對更新過的記錄奐s建簇。 如果需-
n,可以通過周期性地手動執行該命令的方法垂媮L。
在對一茠礅媮L之後,PostgreSQL 會記憶在荅薑牏W建立的簇。 CLUSTER
tablename 的形式就在表以前建簇的同一荅薑牏W建簇。
沒有任何參數的 CLUSTER 將導-
P當前數據庫裏所有調用它的使用者所有的表都被建簇。
(絕不會對不包括進來的表建簇。)這種形式的 CLUSTER 不能在一-
茖峈怢蝻堭調用。
在對一茠穚i行建簇的時唌A則在其上請求一 ACCESS EXCLUSIVE 鎖。
這樣就避免了在 CLUSTER 完成之前執行任何其他的數據庫操作(包括讀寫)。
參閱 Section 12.3 獲取有關數據庫鎖定的更多信息。
PARAMETERS數
indexname
一荅薑犌W稱。
tablename
準備建簇的表的名稱(可能有模式袡╮^。
NOTES`N
如果你只是隨機的訪問表中的行,
那麼在堆表中的數據的實際存儲順序是無關緊n的。
但是,如果你對某些數據的訪問多於其他數據, 而且有一-
荅薑瑄N這些數據分組,那你就將從使用 CLUSTER 中獲益。 如果你從一-
茠矰公虼D一定索引S圍的A 或者是一荅薑瑐L的奰釵h行, CLUSTER
也會有助於應用, 因為如果索引標識出第一匹配行所在的堆存儲-
間A所有其他行也可能已經在同一堆存儲嫁堣F,
這樣便節省了磁碟訪問的時間,加速了查詢。
在這茷媮L的操作過程中,系統先創建一茷鷊荅薑瑗陽堨萿漯磲瑭{時拷貝。
同時也建立表上的每荅薑猼瑭{時拷貝。因此,你需n磁碟上有足夠的剩餘空間,
至少是表大小和索引大小的和。
因為 CLUSTER 記憶建簇信息,我怚i以在第一次的時啎滶妏麊穚i行建簇,
然後設置一蚚似 VACUUM 的時間, 這樣我抴N可以周期地自動對表進行建簇了。
因為規劃器記錄著有關表的排序的統p,所以我怮媊釵b新近建簇的表上運行
ANALYZE。 否則,規劃器可能會選擇很差勁的查詢規劃。
還有一種建簇的方法。 CLUSTER 命令將鴘礅鬺A聲明的索引奐s排列。 這-
荌囮@在操作大表時可能會很慢, 因為每一行都從堆存儲-
嫁堳鰩薑瑗陽出,如果存儲隍磻S有排序, 整茠磹O隨機存放在各荈-
悸滿A因而移動的每一行都n進行一次磁碟雇操作。 PostgreSQL 有一蚑w沖,
但一茪j表的主體是不可能都放到緩沖去的。 另外一種對表建簇的方法是
CREATE TABLE newtable AS
SELECT columnlist FROM table ORDER BY columnlist;
這茈峈k使用PostgreSQL 排序的代碼 ORDER BY 來創建一蚖-
n的順序,在對未排序的數據操作時通常速度比索引掃描快得多。
然後你可以刪除舊表,用 ALTER TABLE ... RENAME將 newtable 改成舊表名,
並且垂婺茠磼狾陳薑煄C但是,這茪隤k不保留 OID,約束,外鍵關系,
賦予的權,以及表的其它附屬的屬性 ---- 所有這些屬性都必須手動垂堙C
EXAMPLESl
以雇的 emp_ind 屬性對employees關系建簇。
CLUSTER emp_ind ON emp;
使用以前用過的同一荅薑瑐髾mployees表進行建簇:
CLUSTER emp;
對以前建過簇的所有表進行建簇:
CLUSTER;
COMPATIBILITYe性
在 SQL 標準裏沒有 CLUSTER 語句。
SEE ALSO見
clusterdb [clusterdb(1)]
者
Postgresql <laser@pgsqldb.org>