代码之家  ›  专栏  ›  技术社区  ›  Venkataraman R

如何减少SQL Server中并发删除和插入到单个表期间的阻塞

  •  2
  • Venkataraman R  · 技术社区  · 8 年前

    我们有一个存储过程,用于加载有关订单的订单详细信息。我们总是需要有关订单的最新信息,因此每次调用存储过程时,都会重新生成订单的订单详细信息。我们正在使用SQL Server 2016。

    • 基于订单标识符的聚集索引删除
    • 根据包含订单信息的巨大查询,插入到表中

    orderdetails 桌子第一个调用者完成后,第二个调用者排队,然后是第三个调用者。所以,这一代人的时代 订单详细信息 随着时间的推移而增加。这种情况尤其发生在包含详细信息行的大订单中>10万或100万或200万,因为表级锁正在发生。

    我们根据订单标识符的最后一位对表进行分区,以实现并发操作 订单详细信息 加载。这提高了首次使用时的性能 加载,因为没有删除。但是,第二次之后, INSERT 在第一个会话中,会导致其他会话阻塞 DELETE . 其他会话被阻止,直到第一个会话完成 插入 .

    我们正在考虑创建单独的 表来避免这种并发问题。

    问题

    删除 & 插入 脚本

    2 回复  |  直到 8 年前
        1
  •  2
  •   Venkataraman R    8 年前

    我们找了一张临时桌子,解决了争论的问题 orderdetails . 我们发现巨大的查询需要更长的时间 选择 时间的延长导致了 桌子

    所以,我们首先将数据加载到临时表中 #orderdetail orderdetail 桌子

    作为 表已分区, 速度更快 插入 这是平行发生的。 插入 这里的速度也很快,因为它是从 #订单详细信息 桌子

        2
  •  1
  •   gotqn user3521065    8 年前

    Hekaton Engine . 即使在 SQL Server Standard Edition 如果您正在使用 SP1

    如果由于硬件或软件的限制,这对于实现来说太复杂,您可以尝试使用 Isolation Levels