我試圖將1,500,000記錄插入到表格中。在插入過程中面臨表鎖問題。所以我想出了下面的批量插入。在不鎖定表格的情況下插入大量記錄
DECLARE @BatchSize INT = 50000
WHILE 1 = 1
BEGIN
INSERT INTO [dbo].[Destination]
(proj_details_sid,
period_sid,
sales,
units)
SELECT TOP(@BatchSize) s.proj_details_sid,
s.period_sid,
s.sales,
s.units
FROM [dbo].[SOURCE] s
WHERE NOT EXISTS (SELECT 1
FROM dbo.Destination d
WHERE d.proj_details_sid = s.proj_details_sid
AND d.period_sid = s.period_sid)
IF @@ROWCOUNT < @BatchSize
BREAK
END
我有Destination
表(proj_details_sid ,period_sid)
聚集索引。 NOT EXISTS
部分只是爲了限制插入的記錄再次插入表
我是這樣做的嗎,這會避免表鎖嗎?或者有沒有更好的辦法。
注:採取時間與批次,無批量插入
加上(nolock)裏面存在的子句,以避免等待鎖 –
@AksheyBhat添加NOLOCK將在這裏造成任何問題,由於髒讀 –
@AksheyBhat只是好奇,SQL將數據插入'目標'表,這'nolock '在'exists clause'中不會生效,不是嗎? – Prisoner