【发布时间】:2017-05-25 16:47:33
【问题描述】:
我有一个只有 500 行的表 S 和一个有 120000 行的表 F。两者都使用 GUID 主键,表 F 持有表 S 的外键。表 F 包含一个 varbinary(max) 列 F.Data,每行大约 100 KB(总数据库大小约为 10 GB)。文件流已打开。我正在使用 SQL Server 2014 Express。
当我执行以下 UPDATE 语句(在 SQL Server Management Studio 中)时,它会影响大约 100000 行
UPDATE F
SET F.Data = 0
FROM F
INNER JOIN S
ON S.SID = F.SID
WHERE S.BITFIELD = 1 AND S.Date < DATEADD(DAY,-90,GETDATE())
查询大约需要 30 分钟。这是相当不可接受的,但我对 SQL 的了解还不够,无法知道为什么或如何使这个查询更有效。有哪位大师可以帮忙吗?
仅供参考,等效的 SELECT 语句只需要几秒钟。我搜索了 Stackoverflow 和其他地方,但没有发现任何特别有用的东西(鉴于我对 SQL 的了解有限)。
【问题讨论】:
-
100,000 个 5Mbytes/行变成 500 GB 的更新信息。那是一个日志。所有这些都需要记录。
-
我想你已经回答了你自己的问题,你有一张大桌子,你正在更新很多......
-
它被记录下来并且它也必须最终出现在表格中。建议将您的更新分成更小的块。最终,您只是移动了太多数据,以至于速度会很慢。
-
@Matt,我的错。我更新了问题。每行大约 100 KB,总数据库大小约为 10 GB。
-
@GordonLinoff,我的错。我更新了问题。每行大约 100 KB,总数据库大小约为 10 GB。
标签: sql sql-server filestream