CLUSTER — 根據索引叢集化資料表
CLUSTER [ (option
[, ...] ) ] [table_name
[ USINGindex_name
] ] whereoption
can be one of: VERBOSE [boolean
]
CLUSTER
指示 PostgreSQL 根據 index_name
指定的索引,叢集化 table_name
指定的資料表。該索引必須已經在 table_name
上定義。
當資料表被叢集化時,它會根據索引資訊進行物理重新排序。叢集化是一次性操作:當資料表後續更新時,變更不會被叢集化。也就是說,不會嘗試根據其索引順序儲存新的或更新的列。(如果需要,可以透過再次執行命令來定期重新叢集化。此外,將資料表的 fillfactor
儲存參數設定為小於 100% 有助於在更新期間保持叢集順序,因為如果該頁面上有足夠的空間,更新的列將保留在同一頁面上。)
當資料表被叢集化時,PostgreSQL 會記住它是按哪個索引叢集化的。CLUSTER
形式使用與之前相同的索引重新叢集化資料表。您也可以使用 table_name
ALTER TABLE
的 CLUSTER
或 SET WITHOUT CLUSTER
形式來設定用於未來叢集操作的索引,或清除任何先前的設定。
沒有 table_name
的 CLUSTER
會重新叢集化目前資料庫中呼叫使用者有權限的所有先前叢集化的資料表。這種形式的 CLUSTER
無法在交易區塊內執行。
當資料表正在被叢集化時,會在其上取得 ACCESS EXCLUSIVE
鎖定。這會阻止任何其他資料庫操作(包括讀取和寫入)在 CLUSTER
完成之前對資料表進行操作。
table_name
資料表的名稱(可能包含 schema 限定詞)。
index_name
索引的名稱。
VERBOSE
在每個資料表叢集化時,列印進度報告。
boolean
指定是否應開啟或關閉所選選項。您可以寫入 TRUE
、ON
或 1
來啟用該選項,並寫入 FALSE
、OFF
或 0
來停用該選項。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
[ USINGindex_name
] ]
在 PostgreSQL 8.3 之前使用以下語法,目前仍然支援
CLUSTERindex_name
ONtable_name
如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用此表格來報告文件問題。