在SQL Server 2008中将合并拆分为批次

时间:2015-12-11 23:42:18

标签: sql sql-server sql-server-2008 merge

我正在尝试找到批量执行SQL Server merge的最佳方法。 TEMPTABLENAME是一个带有id列(以及所有其他列)的临时表。

我正在考虑使用id作为计数器的某种while循环。

merge语句的真正问题是它在处理200K +记录时会将整个表锁定一段时间。我想循环每100行,这样我就可以释放锁,让其他应用程序访问该表。此表具有数百万行,并且每次更新数据时都会触发审计。这导致160K记录在下面的合并中花费大约20到30分钟。

下面的合并代码是代码的示例。可能有大约25列更新/插入。

我愿意找到除合并之外的其他方法来插入数据。我只是无法更改审计系统或表中的记录数量。

merge Employee as Target
using TEMPTABLENAME as Source on (Target.ClientId = Source.ClientId and 
                                  Target.EmployeeReferenceId = Source.EmployeeReferenceId)

when matched then
    update 
    set 
       Target.FirstName = Source.FirstName,
       Target.MiddleName = Source.MiddleName,
       Target.LastName = Source.LastName,
       Target.BirthDate = Source.BirthDate

when not matched then

    INSERT ([FirstName], [MiddleName], [LastName], [BirthDate])
    VALUES (Source.FirstName, Source.MiddleName, Source.LastName, Source.BirthDate)

OUTPUT $action INTO @SummaryOfChanges;

SELECT Change, COUNT(*) AS CountPerChange
FROM @SummaryOfChanges
GROUP BY Change;

0 个答案:

没有答案