我正在尝试找到批量执行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;