我正在尝试将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
table上有一个聚集索引(proj_details_sid ,period_sid )
。NOT EXISTS
部分只是为了限制插入的记录再次插入到表中
我做得对吗,这会避免表锁吗?或者有没有更好的方法。
注意:所用时间或多或少与批处理和没有批处理插入相同