[ PROMPT_NODE_23552 ]
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 亿行
- 具有基于日期查询的时序数据
- 需要高效删除旧数据
参考:[表分区 (Table Partitioning)](https://www.postgresql.org/docs/current/ddl-partitioning.html)