我使用 SQL Server 2014,需要更新一个表中新添加的 datetime 类型列。这两个相关的表(都有超过3000万条记录)如下:
TableA:
这个表格包含每个项目的多条记录,具有不同的
TableB:
“categoryID”和“itemID”都是该表索引的一部分。
为了更新表B中与表A匹配的“CategoryID”和“ItemID”的“LatestUpdatedDate”,我使用了以下合并语句:
鉴于两个表中有数百万条记录,我该如何优化这个脚本?或者有没有其他更好的方法来提高表格更新的性能?
注意:这是一个一次性的脚本,数据库正在运行中,将来会添加一个触发器到tableA中,在插入时更新tableB中的日期。
TableA:
CategoryID, itemID, dataCreated, deleted, some other string properties.
这个表格包含每个项目的多条记录,具有不同的
datecreated
日期。TableB:
CategoryID, itemID, LatestUpdatedDate (This is the new added column)
“categoryID”和“itemID”都是该表索引的一部分。
为了更新表B中与表A匹配的“CategoryID”和“ItemID”的“LatestUpdatedDate”,我使用了以下合并语句:
merge [dbo].[TableB] with(HOLDLOCK) as t
using
(
select CategoryID,itemID, max(DateCreated) as LatestUpdatedDate
from dbo.TableA
where TableA.Deleted = 0
group by CategoryID,itemID
) as s on t.CategoryID = s.CategoryID and t.itemID = s.itemID
when matched then
update
set t.LatestUpdatedDate = s.LatestUpdatedDate
when not matched then
insert (CategoryID, itemID, LatestUpdatedDate)
values (s.CategoryID, s.itemID)
鉴于两个表中有数百万条记录,我该如何优化这个脚本?或者有没有其他更好的方法来提高表格更新的性能?
注意:这是一个一次性的脚本,数据库正在运行中,将来会添加一个触发器到tableA中,在插入时更新tableB中的日期。
s
中有多少行?TableA
中有多少行?最好先将其放入表格中。此外,您是否了解HOLDOCK
的作用?您知道它是否会影响应用程序吗? - Nick.McDermaidHOLDOCK
来防止并发问题,如此处所述:链接。我使用大约5000万行的一些本地虚假数据进行了测试,脚本在10分钟内完成。看起来对于一次性操作是可以接受的。 - xingkong