在INSERT上使用WITH TABLOCK的好处


15

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

当数据库(tempdb)使用恢复模型时,在空表上使用WITH TABLOCKon 还有其他潜在的性能优势吗?INSERTSIMPLE

我正在使用SQL Server 2012 Standard Edition。

我的用例是使用来创建然后立即在存储过程中填充临时表INSERT...SELECT,该表可能包含多达几百万行。我尝试避免这种tempdb滥用,但是有时是需要的。

我正在尝试建立一个需要的案例TABLOCK。似乎它不会伤害任何东西,并且可能会有好处。我试图弄清楚是否有足够的潜在优势可以将其添加到我们整个代码库中的任何位置,我敢肯定没有其他进程要写到表中。

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

Answers:


17

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

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

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

  • 如果新行转到具有页面压缩的现有页面

  • 如果新行通过带有TABLOCK的BULK INSERT插入

  • 如果通过INSERT INTO ...(TABLOCK)SELECT FROM插入新行

否则,该行将被行压缩。

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

另请参阅《数据加载性能指南》

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.