小编GFK*_*GFK的帖子

SQL 更新语句需要很长时间/几个小时的高磁盘使用率

是的,这听起来像是一个非常普遍的问题,但我还没有能够缩小范围。

所以我在 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)

sql-server ssms sql-server-2008-r2

8
推荐指数
1
解决办法
5万
查看次数

标签 统计

sql-server ×1

sql-server-2008-r2 ×1

ssms ×1