防止 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
中的执行数量仍然相同。
我的系统信息:
- 2x E5,
- 用于日志文件的 SSD Raid 0,
- HDD Raid 10 用于数据,
- 用于索引的 SSD Raid 0,
- +64GB DDR3,
- SQL 服务器 2014 SP2
根据问题的确切原因,可以有多种建议:
你的索引。每次执行插入 SQL 服务器都会更新 table 上的所有索引。因此,解决方案是减少 tables.
上的索引数量
IDENTITY 列争用。尝试用 UNIQUEIDENTIFIER
.
替换您的 IDENTITY
列
与页面拆分相关的额外 I/O。定期重建具有较低FILLFACTOR的聚簇索引(极端情况:<50%)。
PFS 争用。在您的数据库中创建多个文件,并将 indexes/tables 拆分为它们。
你在 SQL2014 年。尝试使用内存中的功能。
我有 45 个 active
并发插入事务,每个事务都尝试向某些表中插入(仅插入而不进行任何 select 或更新)大约 250 行。
问题是当一个事务要将数据插入表中时,多索引行和索引页上大约有 1000 个 X 和 IX 锁(sys.dm_tran_locks
)。
我已将索引文件移动到 SSD,但它没有帮助,我仍然有很多待处理的事务,根据 [=44] 上的 Adult logout
,每个事务大约需要 200 毫秒到 4000 毫秒才能完成=] 分析器。
缓冲区 I/O、缓冲区闩锁、锁定、闩锁、日志记录等待时间在 activity 监视器中为 0 或非常低。
我曾尝试增加交易数量,但也无济于事,Activity monitor
中的执行数量仍然相同。
我的系统信息:
- 2x E5,
- 用于日志文件的 SSD Raid 0,
- HDD Raid 10 用于数据,
- 用于索引的 SSD Raid 0,
- +64GB DDR3,
- SQL 服务器 2014 SP2
根据问题的确切原因,可以有多种建议:
你的索引。每次执行插入 SQL 服务器都会更新 table 上的所有索引。因此,解决方案是减少 tables.
上的索引数量
IDENTITY 列争用。尝试用
UNIQUEIDENTIFIER
. 替换您的 与页面拆分相关的额外 I/O。定期重建具有较低FILLFACTOR的聚簇索引(极端情况:<50%)。
PFS 争用。在您的数据库中创建多个文件,并将 indexes/tables 拆分为它们。
你在 SQL2014 年。尝试使用内存中的功能。
IDENTITY
列