支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

CLUSTER

CLUSTER — 根據索引叢集化資料表

概要

CLUSTER [ ( option [, ...] ) ] [ table_name [ USING index_name ] ]

where option can be one of:

    VERBOSE [ boolean ]

描述

CLUSTER 指示 PostgreSQL 根據 index_name 指定的索引,叢集化 table_name 指定的資料表。該索引必須已經在 table_name 上定義。

當資料表被叢集化時,它會根據索引資訊進行物理重新排序。叢集化是一次性操作:當資料表後續更新時,變更不會被叢集化。也就是說,不會嘗試根據其索引順序儲存新的或更新的列。(如果需要,可以透過再次執行命令來定期重新叢集化。此外,將資料表的 fillfactor 儲存參數設定為小於 100% 有助於在更新期間保持叢集順序,因為如果該頁面上有足夠的空間,更新的列將保留在同一頁面上。)

當資料表被叢集化時,PostgreSQL 會記住它是按哪個索引叢集化的。CLUSTER table_name 形式使用與之前相同的索引重新叢集化資料表。您也可以使用 ALTER TABLECLUSTERSET WITHOUT CLUSTER 形式來設定用於未來叢集操作的索引,或清除任何先前的設定。

沒有 table_nameCLUSTER 會重新叢集化目前資料庫中呼叫使用者有權限的所有先前叢集化的資料表。這種形式的 CLUSTER 無法在交易區塊內執行。

當資料表正在被叢集化時,會在其上取得 ACCESS EXCLUSIVE 鎖定。這會阻止任何其他資料庫操作(包括讀取和寫入)在 CLUSTER 完成之前對資料表進行操作。

參數

table_name

資料表的名稱(可能包含 schema 限定詞)。

index_name

索引的名稱。

VERBOSE

在每個資料表叢集化時,列印進度報告。

boolean

指定是否應開啟或關閉所選選項。您可以寫入 TRUEON1 來啟用該選項,並寫入 FALSEOFF0 來停用該選項。boolean 值也可以省略,在這種情況下,假定為 TRUE

注意事項

要叢集化資料表,必須擁有該資料表的 MAINTAIN 權限。

如果您在資料表中隨機存取單個列,則資料表中資料的實際順序並不重要。但是,如果您傾向於存取某些資料比其他資料更多,並且有一個將它們分組在一起的索引,那麼您將受益於使用 CLUSTER。如果您從資料表中請求一系列索引值,或者請求具有多個匹配列的單個索引值,CLUSTER 將會有所幫助,因為一旦索引識別出與第一列匹配的資料表頁面,所有其他匹配列可能已經在同一資料表頁面上,因此您可以節省磁碟存取並加快查詢速度。

CLUSTER 可以使用指定索引上的索引掃描或(如果索引是 b-tree)循序掃描後接排序來重新排序資料表。它將嘗試根據規劃器成本參數和可用的統計資訊來選擇更快的方法。

CLUSTER 執行時,search_path 會暫時變更為 pg_catalog, pg_temp

當使用索引掃描時,會建立資料表的暫時副本,其中包含索引順序中的資料表資料。也會建立資料表上每個索引的暫時副本。因此,您需要在磁碟上至少等於資料表大小和索引大小總和的可用空間。

當使用循序掃描和排序時,也會建立暫時排序檔案,因此峰值暫時空間需求量可能高達資料表大小的兩倍,加上索引大小。此方法通常比索引掃描方法更快,但如果磁碟空間需求無法忍受,您可以透過暫時將 enable_sort 設定為 off 來停用此選項。

建議在叢集化之前將 maintenance_work_mem 設定為相當大的值(但不要超過您可以專用於 CLUSTER 操作的 RAM 量)。

由於規劃器會記錄有關資料表排序的統計資訊,因此建議在新叢集化的資料表上執行 ANALYZE。否則,規劃器可能會做出不良的查詢計畫選擇。

由於 CLUSTER 會記住哪些索引已叢集化,因此可以先手動叢集化想要叢集化的表格,然後設定一個定期維護腳本,執行不帶任何參數的 CLUSTER,以便定期重新叢集化所需的表格。

每個執行 CLUSTER 的後端程式都會在 pg_stat_progress_cluster 檢視表中報告其進度。詳情請參閱第 27.4.2 節

叢集化分割表格會使用指定分割索引的分割區來叢集化其每個分割區。當叢集化分割表格時,不能省略索引。在交易區塊內無法執行分割表格上的 CLUSTER

範例

根據索引 employees_ind 叢集化表格 employees

CLUSTER employees USING employees_ind;

使用先前使用的相同索引來叢集化 employees 表格

CLUSTER employees;

叢集化資料庫中所有先前已叢集化的表格

CLUSTER;

相容性

SQL 標準中沒有 CLUSTER 陳述式。

PostgreSQL 17 之前使用以下語法,目前仍然支援

CLUSTER [ VERBOSE ] [ table_name [ USING index_name ] ]

PostgreSQL 8.3 之前使用以下語法,目前仍然支援

CLUSTER index_name ON table_name

另請參閱

clusterdb第 27.4.2 節

提交更正

如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表格來報告文件問題。