首页 > 解决方案 > 使用 LOB 进行读取已提交快照隔离

问题描述

我在 SQL Server 2017 数据库中有一个表,许多源自多个线程的长时间运行的事务都在使用该表。这会导致每天多次死锁,因此我正在考虑实施读取提交的快照隔离。诀窍是该表有 3 个 VARBINARY(MAX) 列,每个列都包含 10-1000MB 之间的数据(平均值约为 20MB),旁边还有几个 int 和 bit 列。

现在的问题:

Q1: SQL Server 是否会将整行(包括 VARBINARY(MAX) 列)复制到 TEMPDB 中?

Q2:如果是这样,将 VARBINARY(MAX) 列移动到与原始表具有 1:1 关系的单独表中是否会提高性能?

标签: sql-serverisolation-level

解决方案


Sql Server 必须为您提供一致的数据视图(例如,T2 看到您的行,包括 LOB,就像在 T1 开始变异事务之前一样)。这意味着——是的,它别无选择,只能将 LOB 与其余的行数据一起复制。这让我认为是的,性能可能会受益于具有 LOB 的单独表。

像往常一样,我建议做一个简单的实验来衡量两种配置的性能。请在此处发布您的结果。


推荐阅读