gpt4 book ai didi

amazon-redshift - Insert into() (Amazon Redshift) 上不考虑标识列

转载 作者:行者123 更新时间:2023-11-29 12:36:46 25 4
gpt4 key购买 nike

当我从一个具有标识、主键和排序键的表选择到另一个具有自己的一组标识、主键和排序的表时,我最初遇到了这个问题。它没有像定义的那样尊重 (1,1) 身份,而是做 (1,8)(有时是 3,8)。我想可能是因为原来的表被排序了?为了弄清楚发生了什么,我做了一个更简单的查询和数据,并找到了一个跨多个 Redshift 集群的可重现示例。拿这个测试例子来说:

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

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

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

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

最佳答案

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

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

关于amazon-redshift - Insert into() (Amazon Redshift) 上不考虑标识列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35073542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com