[ PROMPT_NODE_25140 ]
schema-partitioning
[ SKILL_DOCUMENTATION ]
## 对大表进行分区以获得更好的性能
分区将大表拆分为较小的部分,从而改善查询性能和维护操作。
**错误(单个大表):**
sql
create table events (
id bigint generated always as identity,
created_at timestamptz,
data jsonb
);
-- 5 亿行数据,查询扫描所有内容
select * from events where created_at > '2024-01-01'; -- 慢
vacuum events; -- 需要数小时,锁定表
**正确(按时间范围分区):**
sql
create table events (
id bigint generated always as identity,
created_at timestamptz not null,
data jsonb
) partition by range (created_at);
-- 为每个月创建分区
create table events_2024_01 partition of events
for values from ('2024-01-01') to ('2024-02-01');
create table events_2024_02 partition of events
for values from ('2024-02-01') to ('2024-03-01');
-- 查询仅扫描相关分区
select * from events where created_at > '2024-01-15'; -- 仅扫描 events_2024_01+
-- 立即删除旧数据
drop table events_2023_01; -- 瞬间完成,而 DELETE 需要数小时
何时进行分区:
- 表行数 > 1 亿
- 具有基于日期的查询的时序数据
- 需要高效删除旧数据
参考:[表分区](https://www.postgresql.org/docs/current/ddl-partitioning.html)