Vorteile der Verwendung von WITH TABLOCK bei einem INSERT

14

INSERT INTO <tablename> (WITH TABLOCK)Aufgrund der minimalen Protokollierung kann das Ausführen eines Vorgangs unter Umständen schneller sein. Zu diesen Umständen gehört, dass die Datenbank im BULK_LOGGEDWiederherstellungsmodell enthalten ist.

Gibt es einen weiteren potenziellen Leistungsvorteil für die Verwendung WITH TABLOCKeiner INSERTin einer leeren Tabelle, wenn die Datenbank ( tempdb ) das SIMPLEWiederherstellungsmodell verwendet?

Ich arbeite mit SQL Server 2012 Standard Edition.

Mein Anwendungsfall ist das Erstellen und sofortige Auffüllen einer temporären Tabelle in einer gespeicherten Prozedur mit einem INSERT...SELECT, die mehrere Millionen Zeilen enthalten kann. Ich versuche, diese Art von Tempdb- Missbrauch zu vermeiden , aber es wird manchmal benötigt.

Ich versuche, einen Fall zu bauen, der es erfordert TABLOCK. Es scheint nicht so, als würde es irgendetwas verletzen und könnte einen Nutzen haben. Ich versuche herauszufinden, ob es genügend potenziellen Nutzen gibt, um ihn überall in unserer Codebasis hinzuzufügen, wo es sicher keinen anderen Prozess gibt, der in die Tabelle schreiben möchte.

Ich füge normalerweise in eine neu erstellte lokale temporäre Tabelle mit einer Cluster-PK ein, verwende aber manchmal einen Heap.

Mark Freeman
quelle

Antworten:

15

Ich kenne einige Vorteile, aber sie sind meist situativ.

  1. Durch TABLOCKdie Verwendung von wird die Parallelität verringert, die Tabellensperre für die Zieltabelle wird jedoch sofort aktiviert. Solange Sie , dass nur eine Sitzung in die Tabelle einfügen wird garantieren können , diese unnötigen Zeilen- oder Seitensperren vermeiden und verhindern eine Sperreneskalation . Wenn Sie so viele Daten einfügen, dass es trotzdem zu einer Sperreneskalation kommt, warum sollten Sie dies nicht im Voraus tun?
  2. Wenn Sie in einen leeren seitenkomprimierten Heap einfügen, ohne dass TABLOCKalle Seiten eine Zeilenkomprimierung anstelle einer Seitenkomprimierung aufweisen :

Die neu eingefügte Zeile ist seitenkomprimiert:

  • Wenn eine neue Zeile zu einer vorhandenen Seite mit Seitenkomprimierung geht

  • wenn die neue Zeile durch BULK INSERT mit TABLOCK eingefügt wird

  • wenn die neue Zeile über INSERT INTO ... (TABLOCK) SELECT FROM eingefügt wird

Andernfalls wird die Zeile zeilenkomprimiert.

  1. In SQL Server 2016 ist der TABLOCKHinweis erforderlich, um paralleles Einfügen in Heaps , CCIs (Clustered Columnstore Indices) und lokale temporäre Tabellen zu erhalten . Es gibt viele Einschränkungen, von denen einige nicht dokumentiert sind. Es kann keine IDENTITYSpalte geben, das Einfügen kann nicht über ein OUTPUTusw. erfolgen.

Siehe auch Das Handbuch zum Laden von Daten

Joe Obbish
quelle