it-swarm.com.de

Vorteile der Verwendung von WITH TABLOCK auf einem INSERT

Unter bestimmten Umständen ist das Ausführen einer INSERT INTO <tablename> (WITH TABLOCK) aufgrund der minimalen Protokollierung schneller. Zu diesen Umständen gehört, dass die Datenbank im BULK_LOGGED Wiederherstellungsmodell.

Gibt es einen anderen potenziellen Leistungsvorteil bei der Verwendung von WITH TABLOCK auf einem INSERT auf einer leeren Tabelle, wenn die Datenbank (tempdb) das Wiederherstellungsmodell SIMPLE 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 bis zu einige Millionen Zeilen enthalten kann. Ich versuche, diese Art von tempdb Missbrauch zu vermeiden, aber es wird manchmal benötigt.

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

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

16
Mark Freeman

Ich kenne einige Vorteile, aber sie sind meistens situativ.

  1. Die Verwendung von TABLOCK verringert die Parallelität, führt jedoch sofort zu einer Tabellensperre für die Zieltabelle. Solange Sie garantieren können, dass nur eine Sitzung in die Tabelle eingefügt wird, werden unnötige Zeilen- oder Seitensperren vermieden und Sperreneskalation verhindert. Wenn Sie so viele Daten einfügen, dass Sie trotzdem eine Eskalation der Sperren erhalten, warum nicht im Voraus?
  2. Wenn Sie in einen leeren, seitenkomprimierten Heap ohne TABLOCK einfügen, haben alle Seiten Zeilenkomprimierung anstelle von Seitenkomprimierung :

Die neu eingefügte Zeile ist seitenkomprimiert:

  • wenn eine neue Zeile mit Seitenkomprimierung zu einer vorhandenen Seite wechselt

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

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

Andernfalls wird die Zeile zeilenkomprimiert.

  1. In SQL Server 2016 ist der Hinweis TABLOCK erforderlich, um eine parallele Einfügung 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 IDENTITY -Spalte geben, das Einfügen kann nicht über ein OUTPUT usw. erfolgen.

Siehe auch Leistungshandbuch zum Laden von Daten

17
Joe Obbish