Benefícios do uso do WITH TABLOCK em um INSERT

15

Sob algumas circunstâncias, fazer um INSERT INTO <tablename> (WITH TABLOCK)será mais rápido devido ao registro mínimo. Essas circunstâncias incluem ter o banco de dados no BULK_LOGGEDmodelo de recuperação.

Existe algum outro benefício potencial de desempenho para usar WITH TABLOCKem uma INSERTtabela vazia quando o banco de dados ( tempdb ) estiver usando o SIMPLEmodelo de recuperação?

Estou trabalhando com o SQL Server 2012 Standard Edition.

Meu caso de uso é para criar e preencher imediatamente uma tabela temporária em um procedimento armazenado usando um INSERT...SELECT, que pode conter até alguns milhões de linhas. Eu tento evitar esse tipo de abuso de tempdb , mas às vezes é necessário.

Estou tentando construir um caso para exigir TABLOCK. Parece que não faria mal a nada e pode ter um benefício. Estou tentando descobrir se existe um benefício potencial suficiente para adicioná-lo em toda a nossa base de códigos, onde tenho certeza de que não há outro processo que queira gravar na tabela.

Normalmente, estou inserindo uma tabela temporária local recém-criada com uma PK em cluster, mas às vezes uso um heap.

Mark Freeman
fonte

Respostas:

17

Conheço alguns benefícios, mas eles são principalmente situacionais.

  1. O uso TABLOCKreduzirá a simultaneidade, mas imediatamente bloqueará a tabela na tabela de destino. Contanto que você possa garantir que apenas uma sessão seja inserida na tabela, isso evitará bloqueios desnecessários de linhas ou páginas e evitará o escalonamento de bloqueios . Afinal, se você estiver inserindo tantos dados, poderá obter a escalada de bloqueios de qualquer maneira, por que não fazê-lo antecipadamente?
  2. Se você estiver inserindo em um heap compactado de página vazio, sem TABLOCKtodas as páginas, haverá compactação de linha em vez de compactação de página :

A linha recém-inserida é compactada na página:

  • se nova linha for para uma página existente com compactação de página

  • se a nova linha for inserida através de BULK INSERT com TABLOCK

  • se a nova linha for inserida por meio de INSERT INTO ... (TABLOCK) SELECT FROM

Caso contrário, a linha será compactada.

  1. No SQL Server 2016, a TABLOCKdica é necessária para obter a inserção paralela em heaps , CCIs (índices de armazenamento de colunas em cluster) e tabelas temporárias locais . Existem muitas restrições, algumas das quais não estão documentadas. Não pode haver uma IDENTITYcoluna, a inserção não pode ser feita por meio de OUTPUTetc.

Consulte também o Guia de desempenho de carregamento de dados

Joe Obbish
fonte