【发布时间】:2015-09-23 15:22:17
【问题描述】:
我有一个经常读取、插入和更新的表(它保存网站用户的会话数据)。它在名为sessionID 的varchar 字段上有一个聚集索引。
我需要根据另一个表中的sessionIDs 列表删除一堆记录。当我尝试一次删除大量它们时,会创建一个锁,以防止表被写入和读取。
如果我在 SSIS 包中使用 foreach 循环逐行删除它们,似乎消除了锁定。
逐行删除是否有任何可能的长期负面影响?
【问题讨论】:
-
用你说的方法有效,是不是锁反了?如果是这样,您可能会从读取尚未提交的数据中获取脏数据。这当然取决于您如何删除数据。
-
不确定,但这可能会让您的日志文件增长得非常快。我认为您不需要逐行删除,最好弄清楚锁不会伤害其他活动的块大小和delete in chunks。
-
感谢@DrCopyPaste,这是一个有用的链接。我确实运行了一个测试以逐行删除 5000 条记录,并且事务日志根本没有增加。 (简单恢复模型)我们目前一次删除 5000 个块,这正在创建锁。
-
对于这种情况可以考虑使用逻辑删除
-
您也可以在较小的主干中删除,例如一次删除 250 行中的 100 行。大多数情况下会越来越快,而且桌子会被锁定得更短
标签: sql sql-server tsql ssis