Beneficios de usar WITH TABLOCK en un INSERT


15

En algunas circunstancias, hacer un INSERT INTO <tablename> (WITH TABLOCK)será más rápido debido a un registro mínimo. Esas circunstancias incluyen tener la base de datos en el BULK_LOGGEDmodelo de recuperación.

¿Hay algún otro beneficio potencial de rendimiento al usar WITH TABLOCKen una INSERTtabla vacía cuando la base de datos ( tempdb ) está usando el SIMPLEmodelo de recuperación?

Estoy trabajando con SQL Server 2012 Standard Edition.

Mi caso de uso es para crear y luego llenar inmediatamente una tabla temporal dentro de un procedimiento almacenado usando un INSERT...SELECT, que podría contener hasta unos pocos millones de filas. Intento evitar ese tipo de abuso de tempdb , pero a veces es necesario.

Estoy tratando de construir un caso para requerir TABLOCK. No parece que vaya a doler nada, y podría tener un beneficio. Estoy tratando de averiguar si hay suficiente beneficio potencial para agregarlo en cualquier parte de nuestra base de código, donde estoy seguro de que no hay otro proceso que quiera escribir en la tabla.

Por lo general, estoy insertando en una tabla temporal local recién creada con un PK agrupado, pero a veces uso un montón.

Respuestas:


17

Sé de algunos beneficios, pero en su mayoría son situacionales.

  1. El uso TABLOCKreducirá la concurrencia, pero tomará inmediatamente un bloqueo de tabla en la tabla de destino. Siempre que pueda garantizar que solo se inserte una sesión en la tabla, esto evitará bloqueos innecesarios de filas o páginas y evitará la escalada de bloqueo . Después de todo, si está insertando tantos datos que obtendrá una escalada de bloqueo de todos modos, ¿por qué no hacerlo por adelantado?
  2. Si está insertando en un montón vacío comprimido de página sin TABLOCKtodas las páginas tendrá compresión de fila en lugar de compresión de página :

La fila recién insertada está comprimida en la página:

  • si una nueva fila va a una página existente con compresión de página

  • si la nueva fila se inserta a través de BULK INSERT con TABLOCK

  • si la nueva fila se inserta a través de INSERT INTO ... (TABLOCK) SELECT FROM

De lo contrario, la fila está comprimida en fila.

  1. En SQL Server 2016, la TABLOCKsugerencia es necesaria para obtener una inserción paralela en montones , CCI (índices de almacén de columnas en clúster) y tablas temporales locales . Hay muchas restricciones, algunas de las cuales no están documentadas. No puede haber una IDENTITYcolumna, la inserción no se puede hacer a través de un OUTPUT, etc.

Consulte también la Guía de rendimiento de carga de datos

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.