2016-01-28 54 views
1

當我從具有標識,主鍵和排序鍵的一個表中選擇具有自己的一組標識,主類,排序。 (1,1)身份不如它所定義的那樣,而是(1,8)(有時是3,8)。我認爲這可能是因爲原始表格被排序?爲了弄清楚發生了什麼,我做了一個更簡單的查詢和數據,並找到了跨多個紅移羣集的可重複的例子。參與我們的測試例子:在插入到()(Amazon 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 

你會注意到標識列不正確遞增。我有其他團隊的朋友試試這個,他們爲c和d列獲得20,27和65,60,而其他列是有序的。請注意,儘管id列的物理順序不正確,但輸出仍按排序鍵/輸入順序正確排序。

當我第一次發現這個問題時,我能想到的奇怪的原始結果和測試查詢之間唯一的相似之處是工會被排序,我的表上有一個sortkey。

有關爲什麼會發生這種情況以及如何解決這個問題的其他想法是受歡迎的。

回答

4

不保證Redshift標識列是由標識跳過值定義的增量。但是,保證這些值永遠不會相互衝突(即它永遠是唯一的)。

跳過的價值來自於Redshift的分佈式架構。每個節點在數字行上保留一些值(n mod x,其中x是集羣中節點的數量)。因此,如果所有節點的行數不相等,您將看到標識值中跳過。