参考 https://thisdataguy.com/2015/01/05/vertica-some-uses-of-sequences/
在 vertica 中有三种定义 identity 字段的方法, 分别是使用 AUTO_INCREMENT
或 IDENTITY
或 sequence
.
简单对比:
- AUTO_INCREMENT 同 SQL Server 的概念一样, sequence 和 Oracle 的概念是一样.
- AUTO_INCREMENT 或 IDENTITY 字段都是直接在表定义时设定的, sequence 是一个独立的对象.
- AUTO_INCREMENT 可以设定的参数最少, 不能设定起始值和增量.
- IDENTITY 可设定的参数稍微多一些, 能设定起始值和增量.
- sequence 可设定的参数很多.
- 从使用的方便性看 AUTO_INCREMENT 或 IDENTITY 最方便了, 但灵活性不如 sequence.
推荐使用 sequence 作为 id 栏位, 尽量不要用 AUTO_INCREMENT 或 IDENTITY, 原因有:
- 如果某个表有 AUTO_INCREMENT 或 IDENTITY 栏位, 在有删除记录的情况下, 再复制一个新表, 新表 id 和 原表 id 就不一致了, 这往往不是我们期望的.
- Vertica 建表 DDL 中, 可以为 id 栏位设定默认值为某个 sequence, 这样方便性就和 AUTO_INCREMENT 或 IDENTITY 一样了.
- Sequence 可以有更多的调优手段, 比如某个表经常要做 bulk copy, 可以为 seq 设定较大的 cache, 以提升 copy 的速度, 如果表的插入频率不大, 可以将 seq 的 cache 设的小一些, 以减少内存的使用.
在数仓项目中, 推荐为不同的 table 设置不同的 sequence, 不要共用, 原因就是上面的 #3.
下面是一个同时使用 seq 和 AUTO_INCREMENT 的示例:
create sequence mydb.my_seq;
CREATE TABLE mydb.test2 (
id1 numeric(38,0) DEFAULT NEXTVAL('my_seq')
,id2 AUTO_INCREMENT
)
SEGMENTED BY HASH(id1) ALL NODES;
;