是的,这听起来像是一个非常普遍的问题,但我还没有能够缩小范围。
所以我在 sql 批处理文件中有一个 UPDATE 语句:
UPDATE A
SET A.X = B.X
FROM A JOIN B ON A.B_ID = B.ID
Run Code Online (Sandbox Code Playgroud)
B 有 40k 条记录,A 有 4M 条记录,它们通过 A.B_ID 一对一关联,尽管两者之间没有 FK。
所以基本上我正在为数据挖掘目的预先计算一个字段。这个题虽然改了表名,但是语句没改,真的就是这么简单。
这需要几个小时才能运行,所以我决定取消一切。数据库损坏了,所以我删除了它,恢复了我在运行该语句之前所做的备份,并决定使用游标更深入地了解细节:
DECLARE CursorB CURSOR FOR SELECT ID FROM B ORDER BY ID DESC -- Descending order
OPEN CursorB
DECLARE @Id INT
FETCH NEXT FROM CursorB INTO @Id
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @Msg VARCHAR(50) = 'Updating A for B_ID=' + CONVERT(VARCHAR(10), @Id)
RAISERROR(@Msg, 10, 1) WITH NOWAIT
UPDATE …
Run Code Online (Sandbox Code Playgroud)