从 table 中删除多行,读写频繁
Delete multiple rows from table with frequent reads and writes
我有一个 table 经常读取、插入和更新(它保存网站用户的会话数据)。它在名为 sessionID
的 varchar
字段上有一个聚集索引。
我需要根据另一个 table 中的 sessionID
列表删除一堆记录。当我尝试一次删除大量它们时,会创建一个锁以防止 table 被写入和读取。
如果我在 SSIS 包中使用 foreach 循环逐行删除它们,似乎可以消除锁定。
逐行删除是否有任何可能的长期负面影响?
好的,所以这是一个关于tab锁、页锁和行锁的问题。发生的事情是您正在从多个页面中删除,因此 sql 锁定了整个 table。 Sql 通常每个事务使用一个锁,因此它会选择覆盖所有受影响行的最小锁。删除单行会使用行锁,删除多条顺序记录会使用页锁,跨页删除记录会锁整个table.
使用 varchar 作为 PK 和聚集索引,您不太可能遇到页面锁定,因为记录在 table 中出现的顺序是随机的(稍后将详细介绍为什么这是非常不受欢迎的)。所以您的选择是行锁或标签锁,因为锁定 table 不是一个选项,行锁是您唯一的选择。
至于不良影响,还有 drcopypaste 提到的事务日志问题,但如果您的 PK/clustered 不是连续的,则问题会更糟。如果每次插入记录或删除记录时都不是连续的,则数据库必须移动所有后续记录,因为聚簇索引(几乎总是在 table pk 上)是行的物理方式按 table.
排序
我有一个 table 经常读取、插入和更新(它保存网站用户的会话数据)。它在名为 sessionID
的 varchar
字段上有一个聚集索引。
我需要根据另一个 table 中的 sessionID
列表删除一堆记录。当我尝试一次删除大量它们时,会创建一个锁以防止 table 被写入和读取。
如果我在 SSIS 包中使用 foreach 循环逐行删除它们,似乎可以消除锁定。
逐行删除是否有任何可能的长期负面影响?
好的,所以这是一个关于tab锁、页锁和行锁的问题。发生的事情是您正在从多个页面中删除,因此 sql 锁定了整个 table。 Sql 通常每个事务使用一个锁,因此它会选择覆盖所有受影响行的最小锁。删除单行会使用行锁,删除多条顺序记录会使用页锁,跨页删除记录会锁整个table.
使用 varchar 作为 PK 和聚集索引,您不太可能遇到页面锁定,因为记录在 table 中出现的顺序是随机的(稍后将详细介绍为什么这是非常不受欢迎的)。所以您的选择是行锁或标签锁,因为锁定 table 不是一个选项,行锁是您唯一的选择。
至于不良影响,还有 drcopypaste 提到的事务日志问题,但如果您的 PK/clustered 不是连续的,则问题会更糟。如果每次插入记录或删除记录时都不是连续的,则数据库必须移动所有后续记录,因为聚簇索引(几乎总是在 table pk 上)是行的物理方式按 table.
排序