web-dev-qa-db-fra.com

Avantages d'utiliser WITH TABLOCK sur un INSERT

Dans certaines circonstances, faire une INSERT INTO <tablename> (WITH TABLOCK) sera plus rapide en raison d'une journalisation minimale. Ces circonstances incluent la présence de la base de données dans le BULK_LOGGED modèle de récupération.

Y a-t-il d'autres avantages potentiels en termes de performances à utiliser WITH TABLOCK sur un INSERT sur une table vide lorsque la base de données (tempdb) utilise le modèle de récupération SIMPLE?

Je travaille avec SQL Server 2012 Standard Edition.

Mon cas d'utilisation consiste à créer puis à remplir immédiatement une table temporaire dans une procédure stockée à l'aide d'un INSERT...SELECT, qui pourrait contenir jusqu'à quelques millions de lignes. J'essaie d'éviter ce genre d'abus tempdb, mais c'est parfois nécessaire.

J'essaye de construire un cas pour exiger TABLOCK. Il ne semble pas que cela nuirait à quelque chose et pourrait avoir un avantage. J'essaie de comprendre s'il y a suffisamment d'avantages potentiels pour l'ajouter n'importe où dans notre base de code, où je suis sûr qu'il n'y a aucun autre processus qui veut écrire dans la table.

J'insère généralement dans une table temporaire locale nouvellement créée avec un PK en cluster, mais j'utilise parfois un tas.

16
Mark Freeman

Je connais quelques avantages, mais ils sont surtout situationnels.

  1. L'utilisation de TABLOCK réduira la concurrence mais prendra immédiatement un verrou de table sur la table cible. Tant que vous pouvez garantir qu'une seule session sera insérée dans le tableau, cela évitera les verrous de ligne ou de page inutiles et empêchera escalade de verrouillage . Après tout, si vous insérez tellement de données que vous obtiendrez une escalade des verrous, pourquoi ne pas le faire dès le départ?
  2. Si vous insérez dans un tas de page compressé vide sans TABLOCK toutes les pages auront compression de ligne au lieu de compression de page :

La nouvelle ligne insérée est compressée en page:

  • si une nouvelle ligne va sur une page existante avec compression de page

  • si la nouvelle ligne est insérée via BULK INSERT avec TABLOCK

  • si la nouvelle ligne est insérée via INSERT INTO ... (TABLOCK) SELECT FROM

Sinon, la ligne est compressée en ligne.

  1. Dans SQL Server 2016, l'indicateur TABLOCK est requis pour obtenir une insertion parallèle dans tas , CCI (Clustered Columnstore Indices) , et tables temporaires locales . Il existe de nombreuses restrictions, dont certaines ne sont pas documentées. Il ne peut pas y avoir de colonne IDENTITY, l'insertion ne peut pas être effectuée via une OUTPUT, etc.

Voir aussi The Data Loading Performance Guide

17
Joe Obbish