PostgreSQL CLUSTER

2021-09-08 17:59 更新

CLUSTER — 根據(jù)一個索引聚簇一個表

大綱

CLUSTER [VERBOSE] table_name [ USING index_name ]
CLUSTER [VERBOSE]

描述

CLUSTER指示PostgreSQL 基于index_name 所指定的索引來聚簇 table_name 所指定的表。該索引必須已經(jīng)定義在 table_name上。

當一個表被聚簇時,會基于索引信息對它進行物理上的排序。聚簇是一種 一次性的操作:當表后續(xù)被更新時,更改沒有被聚簇。也就是說,不會嘗 試根據(jù)新行或者被更新行的索引順序來存儲它們(如果想這樣做,可以周 期性地通過發(fā)出該命令重新聚簇。還有,把表的 fillfactor存儲參數(shù)設置為小于 100% 有助于在更 新期間保持聚簇順序,因為如果空間足夠會把被更新行保留在同一個頁面 中)。

當一個表被更新時,PostgreSQL 會記住它是按照哪個索引聚簇的。形式 CLUSTER table_name 會使用前面所用的同一個索引對表重新聚簇。你也可以使用 CLUSTER或者ALTER TABLESET WITHOUT CLUSTER形式把索引設置為可用于 未來的聚簇操作,或者清除任何之前的設置。

不帶任何參數(shù)的CLUSTER會重新聚簇調(diào)用用 戶所擁有的當前數(shù)據(jù)庫中已經(jīng)被聚簇過的表(如果是超級用戶調(diào)用,則是 所有已被聚簇過的表)。這種形式的 CLUSTER不能在一個事務塊內(nèi)執(zhí)行。

當一個表被聚簇時,會在其上要求一個ACCESS EXCLUSIVE鎖。這會阻止任何其他數(shù)據(jù)庫操作(包括讀和寫) 在CLUSTER結束前在該表上操作。

參數(shù)

table_name

一個表的名稱(可能是模式限定的)。

index_name

一個索引的名稱。

VERBOSE

在每一個表被聚簇時打印一個進度報告。

注解

在隨機訪問一個表中的行時,表中數(shù)據(jù)的實際順序是無關緊要的。 不過,如果你想要更多地訪問其中一些數(shù)據(jù),并且有一個索引把它 們分組在一起,使用CLUSTER就會帶 來好處。如果你從一個表中要求一個范圍的被索引值或者多行都匹 配的一個單一值,CLUSTER就會有所 幫助,因為一旦該索引標識出了第一個匹配行所在的表頁,所有其 他匹配行很可能就在同一個表頁中,并且因此節(jié)省了磁盤訪問并且 提高了查詢速度。

CLUSTER可以使用指定索引上的一次索引掃描 或者遵循排序的一次順序掃描(如果索引是 B 樹)對表重新排序。 它將會基于規(guī)劃器代價參數(shù)以及可用的統(tǒng)計信息來選擇較快的方法。

在使用索引掃描時,會創(chuàng)建該表的一份臨時拷貝,其中包含按索引順序 排列的表數(shù)據(jù)。該表上每一個索引的臨時拷貝也會被創(chuàng)建。因此,在磁 盤上需要至少等于表尺寸加上索引尺寸的綜合的空閑空間。

在使用順序掃描以及排序時,也會創(chuàng)建一個臨時排序文件,因此臨時空 間需求的峰值也就是表尺寸的兩倍外加索引尺寸。這種方法通常比索引 掃描方法更快,但是如果磁盤空間需求是不能接受的,你可以通過臨時 地把enable_sort設置為off來禁 用這種選擇。

建議在聚簇前把maintenance_work_mem設 置為一個合理地比較大的值(但是不能超過你可以用于 CLUSTER操作的 RAM 容量)。

因為規(guī)劃器會記錄有關表順序的統(tǒng)計信息,建議在新近被聚簇的表上 運行ANALYZE。否則,規(guī)劃器可能會產(chǎn)生很差 的查詢計劃。

因為CLUSTER會記住哪些索引被聚簇, 我們可以第一次手動聚簇想要聚簇的表,然后設置一個定期運行的維護 腳本,其中執(zhí)行不帶任何參數(shù)的CLUSTER,這樣那些 表就會被周期性地重新聚簇。

示例

基于索引employees_ind聚簇表 employees

CLUSTER employees USING employees_ind;

使用之前用過的同一個索引聚簇employees表:

CLUSTER employees;

對數(shù)據(jù)庫中以前被聚簇過的所有表進行聚簇:

CLUSTER;

兼容性

在 SQL 標準中沒有CLUSTER語句。

為了兼容 8.3 之前的PostgreSQL版本,

CLUSTER index_name ON table_name

語法也被支持。

另見

clusterdb


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號