Man page - cluster(7)
Manual
CLUSTER
NAMESYNOPSIS
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