2014-05-20 28 views
0

我在升級客戶站點上的應用程序時應運行一些數據庫更新腳本時遇到以下問題。 sql腳本插入大量新的參考數據。主鍵是從應用程序分配的bigint。在更新腳本中,我獲取最高的現有ID並添加一個;因此,我的插入看起來像在SQL服務器中插入值+1 +1

INSERT INTO RefData (ID, ...) VALUES 
    ((SELECT TOP(1) ID + 1 FROM RefData ORDER BY ID DESC), ...), 
    ((SELECT TOP(1) ID + 1 FROM RefData ORDER BY ID DESC), ...) 
GO 

這工作正常(我們的服務器,其他客戶,...)。但是在特定的站點上,服務器嘗試插入具有相同ID的所有行,該行失敗。這似乎是一些並行性問題;但我不知道如何擺脫這種情況。 更新腳本太大,無法在合理的時間內重新修改它;運行時不是一個問題,因爲這是一次性腳本。 我的問題是: 這是一個並行性問題?我試圖配置處理器親和力只有一個CPU,沒有成功。 我也試圖追加

OPTION(MAXDOP 1)

還沒有成功。 有沒有人有一個想法如何規避這個問題?

親切的問候

+0

無關的你的問題,但爲什麼你不使用選擇MAX(ID)+ 1從RefData?您也可以將先前的max(ID)聲明爲一個變量,並將ROW_NUMBER添加到其他插入的ROW_NUMBER。 – HoneyBadger

+0

服務器之間的並行性成本閾值是否匹配?也許它在服務器上更高,如果這個問題不存在並且導致這個問題。 – Russ960

回答

0

我不能看到你的發言是如何工作的?

本聲明:

INSERT INTO RefData (ID, ...) VALUES 
    ((SELECT TOP(1) ID + 1 FROM RefData ORDER BY ID DESC), ...), 
    ((SELECT TOP(1) ID + 1 FROM RefData ORDER BY ID DESC), ...) 
GO 

是一樣的:

DECLARE @Id As BIGINT 
SELECT @Id = TOP(1) ID + 1 FROM RefData ORDER BY ID DESC 

INSERT INTO RefData (ID, ...) VALUES 
    ((SELECT @Id), ...), 
    ((SELECT @Id), ...) 
GO 
+0

我明白了你的觀點,但是在我們自己的sql服務器實例中,它的工作原理應該是這樣的(每一行都有自己的id)。它只有一個5個有這個問題的sql server。 – Maroni

+0

我的觀點是,在每個選擇TOP(1)之間,必須有一個插入(以便每個選擇獲得一個新的ID)。但你正在做一個插入兩個選擇(?) –