【问题标题】:Read Committed Snapshot isolation with LOBs使用 LOB 进行读取已提交的快照隔离
【发布时间】:2020-01-08 16:55:27
【问题描述】:

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

现在问题:

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

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

【问题讨论】:

    标签: sql-server isolation-level


    【解决方案1】:

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

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

    【讨论】:

    • 但是,在更改事务隔离级别之前,您可能不会预先知道许多其他后果,我建议将导致死锁的代码更改为不会发生死锁的代码。
    • 谢谢,但我看不出,我们怎么能做到这一点。与此同时,我们有一些持久的(2-5 分钟)插入事务和大量选择。在允许用户获取数据之前,我们不能等待插入完成。选择总是会阻止插入,反之亦然。
    • 阻塞和死锁是两个非常不同的东西。你所说的使用快照隔离来避免阻塞是完全有道理的。然而,死锁几乎总是意味着“糟糕的代码,需要修复”。 stackoverflow.com/questions/34512/what-is-a-deadlock
    猜你喜欢
    • 2011-02-14
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多