Insert into() (Amazon Redshift) 时不考虑身份列

问题描述 投票:0回答:2

当我从一个具有标识、主键和排序键的表中选择另一个具有自己的标识、主键和排序集的表时,我最初遇到了这个问题。它没有遵循定义的 (1,1) 恒等式,而是遵循 (1,8)(有时是 3,8)。我想这可能是因为原始表已排序?为了弄清楚发生了什么,我做了一个更简单的查询和数据,并在多个红移集群中找到了一个可重现的示例。以这个测试为例:

drop table if exists test;
create temp table test (id int identity(1,1) not null
                    , value varchar(16)
                    , primary key (id))
                    diststyle all
                    sortkey (id);
insert into test (value) select 'a';
insert into test (value) select 'b';
insert into test (value) select 'c' union select 'd';
insert into test (value) values ('e'), ('f'), ('g');

select * from test;

我得到的输出是:

id  value
1   a
2   b
9   c
10  d
3   e
4   f
5   g

您会注意到标识列没有正确递增。我让其他集群上的朋友尝试了这个,他们得到了 20、27 和 65,c 和 d 列是 60,而其他列是有序的。请注意,输出仍然按照输入的排序键/顺序正确“排序”,尽管 id 列在物理上并不按顺序排列。

我能想到的在第一次发现这个时得到的奇怪的原始结果与测试查询之间唯一的相似之处是联合是排序的并且我的表上有一个排序键。

欢迎就为什么会发生这种情况以及如何解决它提出其他想法。

amazon-redshift identity
2个回答
6
投票

Redshift 标识列不保证是由标识跳过值定义的增量。但是,可以保证这些值永远不会发生冲突(即它始终是唯一的)。

价值的跳跃是由于 Redshift 的分布式架构造成的。每个节点在数轴上保留一些值(n mod x,其中 x 是集群中的节点数)。因此,如果所有节点没有获得相同数量的行,您将看到身份值中的跳过。


0
投票

好的...但是有没有办法强制它使用下一个数字递增并同时使用 UNION 语句。

如果我一次插入每一行...我不会遇到这个问题...肯定有一种方法可以使用联合进行插入以避免跳过增量。

© www.soinside.com 2019 - 2024. All rights reserved.