Man page - cluster(7)

Manual

CLUSTER

NAME
SYNOPSIS
DESCRIPTION 描 述
PARAMETERS 引 數
NOTES 注 意
EXAMPLES 例 子
COMPATIBILITY 相 容 性
SEE ALSO 參 見
譯 者


NAME

CLUSTER - 根 據 一 個 索 引 對 某 個 表 集 簇

SYNOPSIS

CLUSTER indexname ON tablename
CLUSTER tablename
CLUSTER

DESCRIPTION 描 述

CLUSTER 指 示 PostgreSQL 基 於 索 引 indexname 的 度 量 對 錶 table 進 行 儲 存 建 簇 。 索 引 必 須 已 經 在 表 tablename. 上 定 義 。

當 對 一 個 表 建 簇 後 , 該 表 的 物 理 儲 存 將 基 於 索 引 資 訊 進 行 。 建 簇 是 一 次 性 操 作 : 也 就 是 說 , 當 表 隨 後 被 更 新 後 , 改 變 的 內 容 不 會 建 簇 。 也 就 是 說 , 系 統 不 會 試 圖 按 照 索 引 順 序 對 更 新 過 的 記 錄 重 新 建 簇 。 如 果 需 要 , 可 以 透 過 週 期 性 地 手 工 執 行 該 命 令 的 方 法 重 建 簇 。

在 對 一 個 表 建 簇 之 後 , PostgreSQL 會 記 憶 在 哪 個 索 引 上 建 立 的 簇 。 CLUSTER tablename 的 形 式 就 在 表 以 前 建 簇 的 同 一 個 索 引 上 建 簇 。

沒 有 任 何 引 數 的 CLUSTER 將 導 致 當 前 資 料 庫 裡 所 有 呼 叫 它 的 使 用 者 所 有 的 表 都 被 建 簇 。 ( 絕 不 會 對 不 包 括 進 來 的 表 建 簇 。 ) 這 種 形 式 的 CLUSTER 不 能 在 一 個 事 務 或 者 函 數 里 面 呼 叫 。

在 對 一 個 表 進 行 建 簇 的 時 候 , 則 在 其 上 請 求 一 個 ACCESS EXCLUSIVE 鎖 。 這 樣 就 避 免 了 在 CLUSTER 完 成 之 前 執 行 任 何 其 他 的 資 料 庫 操 作 ( 包 括 讀 寫 ) 。 參 閱 Section 12.3 獲 取 有 關 資 料 庫 鎖 定 的 更 多 資 訊 。

PARAMETERS 引 數

indexname

一 個 索 引 名 稱 。

tablename

準 備 建 簇 的 表 的 名 稱 ( 可 能 有 模 式 修 飾 ) 。

NOTES 注 意

如 果 你 只 是 隨 機 的 訪 問 表 中 的 行 , 那 麼 在 堆 表 中 的 資 料 的 實 際 儲 存 順 序 是 無 關 緊 要 的 。 但 是 , 如 果 你 對 某 些 資 料 的 訪 問 多 於 其 他 資 料 , 而 且 有 一 個 索 引 將 這 些 資 料 分 組 , 那 你 就 將 從 使 用 CLUSTER 中 獲 益 。 如 果 你 從 一 個 表 中 請 求 一 定 索 引 範 圍 的 值 , 或 者 是 一 個 索 引 過 的 值 對 應 多 行 , CLUSTER 也 會 有 助 於 應 用 , 因 為 如 果 索 引 標 識 出 第 一 匹 配 行 所 在 的 堆 儲 存 頁 , 所 有 其 他 行 也 可 能 已 經 在 同 一 堆 儲 存 頁 裡 了 , 這 樣 便 節 省 了 磁 碟 訪 問 的 時 間 , 加 速 了 查 詢 。

在 這 個 建 簇 的 操 作 過 程 中 , 系 統 先 建 立 一 個 按 照 索 引 順 序 建 立 的 表 的 臨 時 複 製 。 同 時 也 建 立 表 上 的 每 個 索 引 的 臨 時 複 製 。 因 此 , 你 需 要 磁 碟 上 有 足 夠 的 剩 餘 空 間 , 至 少 是 表 大 小 和 索 引 大 小 的 和 。

因 為 CLUSTER 記 憶 建 簇 資 訊 , 我 們 可 以 在 第 一 次 的 時 候 手 工 對 錶 進 行 建 簇 , 然 後 設 定 一 個 類 似 VACUUM 的 時 間 , 這 樣 我 們 就 可 以 週 期 地 自 動 對 錶 進 行 建 簇 了 。

因 為 規 劃 器 記 錄 著 有 關 表 的 排 序 的 統 計 , 所 以 我 們 建 議 在 新 近 建 簇 的 表 上 執 行 ANALYZE。 否 則 , 規 劃 器 可 能 會 選 擇 很 差 勁 的 查 詢 規 劃 。

還 有 一 種 建 簇 的 方 法 。 CLUSTER 命 令 將 原 表 按 你 宣 告 的 索 引 重 新 排 列 。 這 個 動 作 在 操 作 大 表 時 可 能 會 很 慢 , 因 為 每 一 行 都 從 堆 儲 存 頁 裡 按 索 引 順 序 取 出 , 如 果 儲 存 頁 表 沒 有 排 序 , 整 個 表 是 隨 機 存 放 在 各 個 頁 面 的 , 因 而 移 動 的 每 一 行 都 要 進 行 一 次 磁 碟 頁 面 操 作 。 PostgreSQL 有 一 個 緩 衝 , 但 一 個 大 表 的 主 體 是 不 可 能 都 放 到 緩 衝 去 的 。 另 外 一 種 對 錶 建 簇 的 方 法 是

CREATE TABLE newtable AS
SELECT columnlist FROM table ORDER BY columnlist ;

這 個 用 法 使 用 PostgreSQL 排 序 的 程 式 碼 ORDER BY 來 建 立 一 個 需 要 的 順 序 , 在 對 未 排 序 的 資 料 操 作 時 通 常 速 度 比 索 引 掃 描 快 得 多 。 然 後 你 可 以 刪 除 舊 錶 , 用 ALTER TABLE ... RENAME將 newtable 改 成 舊 錶 名 , 並 且 重 建 該 表 所 有 索 引 。 但 是 , 這 個 方 法 不 保 留 OID, 約 束 , 外 部 索 引 鍵 關 係 , 賦 予 的 許 可 權 , 以 及 表 的 其 它 附 屬 的 屬 性 ---- 所 有 這 些 屬 性 都 必 須 手 工 重 建 。

EXAMPLES 例 子

以 僱 員 的 emp_ind 屬 性 對 employees關 係 建 簇 。

CLUSTER emp_ind ON emp;

使 用 以 前 用 過 的 同 一 個 索 引 對 employees表 進 行 建 簇 :

CLUSTER emp;

對 以 前 建 過 簇 的 所 有 表 進 行 建 簇 :

CLUSTER;

COMPATIBILITY 相 容 性

在 SQL 標 準 裡 沒 有 CLUSTER 語 句 。

SEE ALSO 參 見

clusterdb [ clusterdb (1)]

譯 者

Postgresql 中 文 網 站 何 偉 平 <laser@pgsqldb.org>

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。
中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh