从 table 中删除多行,读写频繁

Delete multiple rows from table with frequent reads and writes

我有一个 table 经常读取、插入和更新(它保存网站用户的会话数据)。它在名为 sessionIDvarchar 字段上有一个聚集索引。

我需要根据另一个 table 中的 sessionID 列表删除一堆记录。当我尝试一次删除大量它们时,会创建一个锁以防止 table 被写入和读取。

如果我在 SSIS 包中使用 foreach 循环逐行删除它们,似乎可以消除锁定。

逐行删除是否有任何可能的长期负面影响?

好的,所以这是一个关于tab锁、页锁和行锁的问题。发生的事情是您正在从多个页面中删除,因此 sql 锁定了整个 table。 Sql 通常每个事务使用一个锁,因此它会选择覆盖所有受影响行的最小锁。删除单行会使用行锁,删除多条顺序记录会使用页锁,跨页删除记录会锁整个table.

使用 varchar 作为 PK 和聚集索引,您不太可能遇到页面锁定,因为记录在 table 中出现的顺序是随机的(稍后将详细介绍为什么这是非常不受欢迎的)。所以您的选择是行锁或标签锁,因为锁定 table 不是一个选项,行锁是您唯一的选择。

至于不良影响,还有 drcopypaste 提到的事务日志问题,但如果您的 PK/clustered 不是连续的,则问题会更糟。如果每次插入记录或删除记录时都不是连续的,则数据库必须移动所有后续记录,因为聚簇索引(几乎总是在 table pk 上)是行的物理方式按 table.

排序