在 Insert into() 上不尊重身份列 (Amazon Redshift)
Posted
技术标签:
【中文标题】在 Insert into() 上不尊重身份列 (Amazon Redshift)【英文标题】:Identity Column not respected on Insert into() (Amazon Redshift) 【发布时间】:2016-01-28 22:40:10 【问题描述】:当我从一个具有标识、主键和排序键的表中选择另一个具有自己的一组标识、主键和排序的表时,我最初遇到了这个问题。它不尊重定义的 (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、60 用于 c 和 d 列,而其他列是按顺序排列的。请注意,尽管 id 列在物理上并没有按顺序排列,但输出仍然按输入的排序键/顺序正确“排序”。
我第一次发现这个和测试查询时得到的奇怪的原始结果之间唯一的相似之处是联合是排序的,我的表上有一个排序键。
欢迎提出关于为什么会发生这种情况以及如何解决它的其他想法。
【问题讨论】:
【参考方案1】:不保证 Redshift 标识列是由标识跳过值定义的增量。但是,可以保证这些值永远不会发生冲突(即它始终是唯一的)。
价值的跳跃来自于 Redshift 的分布式架构。每个节点在数轴上保留一些值(n mod x 其中 x 是集群中的节点数)。因此,如果所有节点没有获得相同数量的行,您将在标识值中看到跳过。
【讨论】:
以上是关于在 Insert into() 上不尊重身份列 (Amazon Redshift)的主要内容,如果未能解决你的问题,请参考以下文章
INSERT INTO .. ON DUPLICATE KEY更新多行记录
使用 insert into select 将源列添加到输出子句
SELECT INTO 和 INSERT INTO SELECT