防止 SQL 服务器并发插入锁定

Prevent SQL Server concurrency insert locking

我有 45 个 active 并发插入事务,每个事务都尝试向某些表中插入(仅插入而不进行任何 select 或更新)大约 250 行。

问题是当一个事务要将数据插入表中时,多索引行和索引页上大约有 1000 个 X 和 IX 锁(sys.dm_tran_locks)。

我已将索引文件移动到 SSD,但它没有帮助,我仍然有很多待处理的事务,根据 [=44] 上的 Adult logout,每个事务大约需要 200 毫秒到 4000 毫秒才能完成=] 分析器。

缓冲区 I/O、缓冲区闩锁、锁定、闩锁、日志记录等待时间在 activity 监视器中为 0 或非常低。

我曾尝试增加交易数量,但也无济于事,Activity monitor 中的执行数量仍然相同。

我的系统信息:

根据问题的确切原因,可以有多种建议:

  1. 你的索引。每次执行插入 SQL 服务器都会更新 table 上的所有索引。因此,解决方案是减少 tables.

  2. 上的索引数量
  3. IDENTITY 列争用。尝试用 UNIQUEIDENTIFIER.

  4. 替换您的 IDENTITY
  5. 与页面拆分相关的额外 I/O。定期重建具有较低FILLFACTOR的聚簇索引(极端情况:<50%)。

  6. PFS 争用。在您的数据库中创建多个文件,并将 indexes/tables 拆分为它们。

  7. 你在 SQL2014 年。尝试使用内存中的功能。