SQL Academy · 课时

范围、列表与哈希分区

选择合适的分区策略:时间序列使用范围分区,租户使用列表分区,均匀分布使用哈希分区

第 2 / 4 课14 个步骤

范围、列表与哈希分区 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

范围分区

每个分区覆盖一个连续的值范围。最常用于时间序列:

CREATE TABLE events (
  id BIGSERIAL,
  ts TIMESTAMPTZ NOT NULL,
  data JSONB
) PARTITION BY RANGE (ts);

CREATE TABLE events_2024_q1 PARTITION OF events
  FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
CREATE TABLE events_2024_q2 PARTITION OF events
  FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');

范围边界是半开区间

FROM 包含边界,TO 不包含边界。边界可以整齐对齐 — 没有重叠,也没有间隙。

列表分区

每个分区保存特定值:

CREATE TABLE customers (
  id BIGSERIAL,
  country TEXT NOT NULL,
  name TEXT
) PARTITION BY LIST (country);

CREATE TABLE customers_us PARTITION OF customers FOR VALUES IN ('US');
CREATE TABLE customers_eu PARTITION OF customers FOR VALUES IN ('DE','FR','IT','ES','NL');
CREATE TABLE customers_other PARTITION OF customers DEFAULT;

DEFAULT 分区

接收不匹配其他分区的行。如果没有该分区,插入不匹配的行时 INSERT 会失败。

哈希分区

通过对分区键进行哈希来分配行。当您希望均匀分布,但没有自然的范围或列表时,这种方式很适合:

CREATE TABLE sessions (
  id UUID,
  user_id BIGINT,
  data JSONB
) PARTITION BY HASH (user_id);

CREATE TABLE sessions_0 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE sessions_1 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE sessions_2 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE sessions_3 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 3);

选择策略

  • 范围 — 时间序列、单调递增的 ID
  • 列表 — 租户、国家、热门层级
  • 哈希 — 没有自然偏斜,只希望实现并行处理时

子分区

分区本身还可以继续分区(多级分区):

CREATE TABLE events_2024 PARTITION OF events
  FOR VALUES FROM ('2024-01-01') TO ('2025-01-01')
  PARTITION BY HASH (user_id);
-- 2024 is a yearly range partition, internally hashed by user_id.

分区表上的索引

父表上的索引会自动传播到所有分区。UNIQUE 约束必须包含分区键:

CREATE INDEX events_user_idx ON events (user_id);
-- Creates one index per partition automatically.

ALTER TABLE events ADD CONSTRAINT events_uniq UNIQUE (id, ts);
-- ts must be in the constraint because it's the partition key.

主键与分区

分区表的 PRIMARY KEY 必须包含分区列。这是声明式分区的一项基本约束。

添加和删除分区

低成本操作:

CREATE TABLE events_2024_q3 PARTITION OF events
  FOR VALUES FROM ('2024-07-01') TO ('2024-10-01');

DROP TABLE events_2023_q1;
-- Instant; equivalent to deleting all old data.

自动创建分区

Postgres 不会自动创建未来的分区。常见解决方案包括:

  • pg_partman 扩展 — 管理每月分区
  • 运行计划任务来 CREATE 下一个分区

外键

指向分区表的 FK 需要 PG 12+。从分区表指向普通表的 FK 可以正常工作。

回顾

三种分区策略可以覆盖大多数情况。

  • 范围适用于时间或顺序数据
  • 列表适用于离散集合
  • 哈希适用于均匀分布
  • PK 必须包含分区列

快速检查

您希望按 user_id 对 sessions 表进行分区,要求数据均匀分布且没有自然顺序。应采用哪种策略?

免费开始

用 AI 导师学习 SQL — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
46
课程
183

常见问题解答

「范围、列表与哈希分区」课时是免费的吗?

是的 — 「范围、列表与哈希分区」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「范围、列表与哈希分区」这节课中我会学到什么?

选择合适的分区策略:时间序列使用范围分区,租户使用列表分区,均匀分布使用哈希分区 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「范围、列表与哈希分区」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为什么要分区:裁剪与维护
  2. 范围、列表与哈希分区
  3. 分离与附加分区
  4. 高效查询跨分区数据
← 返回 SQL Academy