详解数仓对象设计中序列SEQUENCE原理与应用
内容提要
本文介绍了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);