Provided by: manpages-zh_1.5-1_all bug

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>