2015-05-14 32 views
5

update語句我用下面的代碼從You've Been Haacked blog post有需要重新編碼表中的行:自動遞增,導致重複值的大表

DECLARE @counter int 
SET @counter = 0 
UPDATE #myTable 
SET @counter = ID = @counter + 1 

這正常工作與一些記錄到幾千元,但是當我在具有250K +記錄的表上的SQL Server 2012(64位)實例上運行它時,我最終得到許多重複項(ID#1出現12次)。總共有大約27K個重複值的記錄。奇怪的是,大約19K有12個傻瓜(我的機器上的處理器數量相同)。

重複的原因是什麼?

+1

我會說這條語句並行執行,而不是逐行執行。因此,計數器不會遞增「足夠快」。, –

+0

你能發佈你的查詢計劃嗎? – dsolimano

+1

這不是執行此操作的最佳方法。 @GiorgiNakeuri已經說過,ROW_NUMBER會是一個更好的方法。您可以添加查詢提示OPTION(MAXDOP 1)以防止它溢出到多個處理器上。但表現可能會受到影響。 –

回答

5

這並不能保證我敢肯定,菲爾哈克呼籲。拋棄此代碼。

可能的原因是並行性。該變量可能會在多個線程中受到攻擊。

奇怪的是,約19K有12個模糊(我的機器上的處理器數量相同)。

這符合解釋。

使用ROW_NUMBER產生良好的保證工作的ID:

update t 
set ID = r 
from (
select *, row_number() over (order by something) r from T 
) t 

也很簡單,但神志清醒。