一尘不染

在 INSERT 上使用 WITH TABLOCK 的好处

sql-server

在某些情况下,INSERT INTO <tablename> (WITH TABLOCK)由于日志记录最少,执行 an 会更快。这些情况包括将数据库置于BULK_LOGGED恢复模型中。

当数据库 ( tempdb ) 使用恢复模型时,在空表上WITH TABLOCK使用是否还有其他潜在的性能优势?INSERT``SIMPLE

我正在使用 SQL Server 2012 标准版。

我的用例是使用一个存储过程创建并立即填充一个临时表INSERT...SELECT,它可能包含多达几百万行。我尽量避免这种tempdb滥用,但有时需要这样做。

我正在尝试建立一个案例来要求TABLOCK. 它似乎不会伤害任何东西,并且可能有好处。我试图弄清楚是否有足够的潜在好处将它添加到我们代码库的任何地方,我确信没有其他进程想要写入表。

我通常使用集群 PK 插入到新创建的本地临时表中,但有时会使用堆。


阅读 150

收藏
2022-11-16

共1个答案

一尘不染

我知道一些好处,但它们主要是视情况而定。

  1. 使用TABLOCK会降低并发性,但会立即对目标表进行表锁定。只要您可以保证只有一个会话将插入到表中,这将避免不必要的行或页锁并防止锁升级。毕竟,如果您要插入如此多的数据以至于无论如何都会升级锁,为什么不提前进行呢?
  2. 如果您要插入一个空的页面压缩堆,而没有TABLOCK所有页面将进行行压缩而不是页面压缩

新插入的行是页面压缩的:

  • 如果新行转到具有页面压缩的现有页面
  • 如果新行是通过带有 TABLOCK 的 BULK INSERT 插入的
  • 如果通过 INSERT INTO … (TABLOCK) SELECT FROM 插入新行

否则,该行是行压缩的。

  1. 在 SQL Server 2016 中,TABLOCK需要提示才能并行插入堆、CCI(集群列存储索引)和本地临时表。有很多限制,其中一些没有记录。不能有IDENTITY列,插入不能通过OUTPUT等完成。

另见数据加载性能指南

2022-11-16