Avantages d'utiliser WITH TABLOCK sur un INSERT

15

Dans certaines circonstances, faire un 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_LOGGEDmodèle de récupération.

Existe-t-il un autre avantage potentiel en termes de performances à utiliser WITH TABLOCKsur une INSERTtable vide lorsque la base de données ( tempdb ) utilise le SIMPLEmodèle de récupération?

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 de tempdb , mais c'est parfois nécessaire.

J'essaie de construire un cas à 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 partout dans notre base de code, où je suis sûr qu'il n'y a aucun autre processus qui souhaite é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.

Mark Freeman
la source

Réponses:

17

Je connais quelques avantages, mais ils sont principalement situationnels.

  1. L'utilisation TABLOCKréduira la simultanéité 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 l' escalade des verrous . 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 segment de page compressé vide sans que TABLOCKtoutes les pages aient une compression de ligne au lieu d'une 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 , le TABLOCKconseil est nécessaire pour obtenir insertion parallèle en tas , CCI ( en cluster) Indices columnstore et tables temporaires locales . Il existe de nombreuses restrictions, dont certaines ne sont pas documentées. Il ne peut pas y avoir de IDENTITYcolonne, l'insertion ne peut pas être effectuée via un OUTPUT, etc.

Voir aussi le Guide de performances de chargement de données

Joe Obbish
la source