详解数仓对象设计中序列SEQUENCE原理与应用

💡 原文中文,约11100字,阅读约需27分钟。
📝

内容提要

本文介绍了GaussDB(DWS)数据库中序列SEQUENCE的原理和使用方法,包括创建、修改和删除序列,以及相关函数的使用。总结了SEQUENCE的使用场景和常见问题的解决方法。

🔎

延伸解读

cache 的权衡:性能提升与序列空洞

文章指出,为序列指定 cache 可一次预申请多个序列值,减少与 GTM 的交互次数,从而提升性能。但 cache 会导致序列值不连续,产生空洞,且不能保序。此外,cache 值不宜过大,否则每个 cache 周期的第一个 nextval 耗时过长,建议小于 100000000。实际使用时应根据业务设置合理值,在快速访问与序列号浪费之间取得平衡。

高并发与批量导入场景下的性能风险

序列值由全局唯一的 GTM 维护,默认每次申请都需与 GTM 交互,容易成为性能瓶颈。在 Bulkload 或 INSERT FROM SELECT 等大量产生序列号的场景中,性能会非常慢。文章建议避免在批量导入时产生默认序列值,或为序列定义足够大的 cache,并控制并发数目,以防耗尽 GTM 连接资源。

setval 的谨慎使用与缓存可见性

setval 用于设置序列当前值,但序列操作不支持回滚,setval 的修改不会因事务回滚而撤销。setval 后当前会话立即生效,但其他会话若有缓存序列值,需等缓存用尽才能感知。因此,为避免重复值,setval 设置的新值不能是已产生的值或在缓存中的值,使用需格外谨慎。

序列依赖关系与当前值查询方法

文章提供了查询序列依赖关系的方法:先在 pg_class 查找序列的 oid,再在 pg_depend 根据 oid 查依赖对象。查询序列当前最新值可使用 currval 函数,但需当前会话已调用过 nextval。last_value 因序列自增不严格逐个增加而无实际意义,可用 lastval() 查询,但需注意其默认不支持,需开启相关参数。

❓

Q&A

什么是序列SEQUENCE,它的主要用途是什么?

序列SEQUENCE是用于生成唯一整数的数据库对象,常作为主键使用。

如何创建一个新的序列?

可以使用CREATE SEQUENCE语句创建新的序列,或通过声明字段为序列整型来自动创建。

ALTER SEQUENCE命令的作用是什么?

ALTER SEQUENCE命令用于修改现有序列的属性,如最大值和归属列。

如何删除一个序列?

使用DROP SEQUENCE命令可以删除一个序列,只有序列的所有者或管理员可以执行此操作。

在高并发场景下使用序列时需要注意什么?

在高并发场景下使用序列时需注意性能问题,可能会导致序列值不连续。

如何重置序列的当前值?

可以使用setval函数重置序列的当前值,例如:SELECT setval('sequence_name', new_value);

🏷️

标签

➡️

继续阅读