Hubert 'depesz' Lubaczewski:等待 PostgreSQL 17 —— 在分区表中支持标识列

💡 原文英文,约1800词,阅读约需7分钟。
📝

内容提要

2024年1月16日,Peter Eisentraut提交了一个补丁,允许在分区表中使用标识列。新创建的分区和附加的分区会继承标识属性,但分离分区时会丢失标识属性。分区表支持常规的ALTER操作,但不能有主键或唯一约束。可以在分区上直接添加唯一约束。查询时,Pg会扫描所有分区,使用id索引可以提高查询速度。设置主键会破坏对分区的直接插入。

🔎

延伸解读

标识列在分区表中的共享机制

分区表的所有分区共享同一个底层序列,因此标识列的值在整个分区层次结构中保持唯一且连续。直接向分区插入数据时,也会使用顶层分区表的序列来计算标识值。这意味着无论数据最终落入哪个分区,标识列都按插入顺序分配,不会因分区不同而产生重复或冲突。

主键与唯一约束的限制

分区表上不能直接为标识列添加主键或唯一约束,因为PostgreSQL要求唯一约束必须包含所有分区键列。如果分区键不是标识列,则无法在分区表级别创建主键。不过,可以在每个分区上单独添加唯一约束,但这会导致查询时无法利用分区裁剪,需要扫描所有分区来定位特定标识值。

分离分区时的标识属性变化

当分区从分区表中分离时,其标识列会丢失标识属性,因为不再共享顶层序列。但NOT NULL约束会保留,且关联的序列仍属于原分区表,不会被删除。这意味着分离后的表不再自动生成标识值,需要手动处理或重新定义标识列。

以标识列作为分区键的实践

如果直接使用标识列作为分区键,则可以在分区表上定义主键,因为主键自然包含分区键。这种设计下,查询能有效利用分区裁剪和索引。但直接向分区插入数据可能失败,因为新生成的标识值可能超出该分区的范围,需要确保插入到正确的分区。

❓

Q&A

PostgreSQL 17 中分区表支持标识列了吗?

是的,PostgreSQL 17 开始支持在分区表中使用标识列。2024年1月16日,Peter Eisentraut 提交了相关补丁。

分区表使用标识列时,新分区和附加分区会继承标识属性吗?

新创建的分区会继承标识属性,附加的分区也会继承。但如果附加的是分区表,标识属性会向下传播到其分区层次结构。

分离分区时,标识列会有什么变化?

分离分区时,该分区的标识列会丢失标识属性,但 NOT NULL 约束会保留。底层序列仍与分区表关联,不会被删除。

分区表上能添加主键或唯一约束吗?

分区表上不能直接添加主键或唯一约束,除非约束包含所有分区列。但可以在各个分区上直接添加唯一约束。

在分区表中使用标识列,查询性能如何?

查询时 PostgreSQL 会扫描所有分区,但如果分区上有 id 索引,查询会使用索引,速度较快。

如果分区表以标识列作为分区键,可以设置主键吗?

可以。如果分区表以标识列作为分区键,则可以设置主键。但这样会破坏对分区的直接插入,因为新生成的 id 可能不属于该分区。

🏷️

标签

➡️

继续阅读