Ich versuche, die Unterschiede zwischen den Befehlen DELETE
und besser zu verstehen TRUNCATE
. Mein Verständnis der Interna geht in etwa so:
DELETE
-> das Datenbankmodul findet und entfernt die Zeile von den relevanten Datenseiten und allen Indexseiten, auf denen die Zeile eingegeben wird. Je mehr Indizes vorhanden sind, desto länger dauert das Löschen.
TRUNCATE
-> Entfernt einfach alle Datenseiten der Tabelle, um den Inhalt einer Tabelle effizienter zu löschen.
Angenommen, das oben Genannte ist richtig (bitte korrigieren Sie mich, wenn nicht):
- Wie wirken sich verschiedene Wiederherstellungsmodi auf jede Anweisung aus? Wenn es überhaupt einen Effekt gibt
- Werden beim Löschen alle Indizes gescannt oder nur die, in denen sich die Zeile befindet? Ich würde annehmen, dass alle Indexe gescannt werden (und nicht gesucht werden?)
- Wie werden die Befehle repliziert? Wird der SQL-Befehl auf jedem Teilnehmer gesendet und verarbeitet? Oder ist MSSQL ein bisschen intelligenter als das?
sql-server
database-internals
Stuart Blackler
quelle
quelle
DELETE
undTRUNCATE
in den Antworten auf diese Frage zum Nutzen vonTRUNCATE
-ing unmittelbar vor aDROP
. Sie können auch selbst im Protokoll stöbern, um die Auswirkungen beider Befehle mithilfe der in dieser Antwort beschriebenen Technik zu untersuchen .TRUNCATE
kann zurückgesetzt werden. Nick deckt das in seiner Antwort auf die Frage ab, die er verlinkt hat .Antworten:
Ja, obwohl es hier zwei Möglichkeiten gibt. Zeilen können von demselben Operator, der die Löschvorgänge für die Basistabelle ausführt, zeilenweise aus nicht gruppierten Indizes gelöscht werden. Dies wird als enger (oder zeilenweiser) Aktualisierungsplan bezeichnet:
Alternativ können die nicht gruppierten Indexlöschungen von separaten Operatoren ausgeführt werden, einer pro nicht gruppiertem Index. In diesem Fall (als breiter oder indexspezifischer Aktualisierungsplan bezeichnet) wird der gesamte Satz von Aktionen in einer Worktabelle (eifrige Spool) gespeichert, bevor er einmal pro Index wiedergegeben wird. Oft wird er explizit nach den Schlüsseln des jeweiligen nicht gruppierten Index sortiert, um eine sequenzielle Aktualisierung zu fördern Zugriffsmuster.
Ja.
TRUNCATE TABLE
ist aus mehreren Gründen effizienter:Das Löschen wird immer vollständig protokolliert (jede gelöschte Zeile wird im Transaktionsprotokoll aufgezeichnet). Es gibt einige kleine Unterschiede im Inhalt von Protokolldatensätzen, wenn das Wiederherstellungsmodell anders ist als
FULL
, aber dies ist immer noch eine technisch vollständige Protokollierung.Das Löschen einer Zeile in einem Index (entweder mit den zuvor gezeigten engen oder breiten Aktualisierungsplänen) ist immer ein Zugriff per Schlüssel (eine Suche). Das Durchsuchen des gesamten Index für jede gelöschte Zeile wäre fürchterlich ineffizient. Schauen wir uns noch einmal den oben gezeigten Aktualisierungsplan pro Index an:
Ausführungspläne sind bedarfsgesteuerte Pipelines: Übergeordnete Operatoren (links) veranlassen untergeordnete Operatoren zur Arbeit, indem sie jeweils eine Zeile von ihnen anfordern. Die Sortieroperatoren blockieren (sie müssen ihre gesamte Eingabe verbrauchen, bevor sie die erste sortierte Zeile erzeugen), werden jedoch weiterhin von ihrem übergeordneten Operator (dem Index Delete) gesteuert, der diese erste Zeile anfordert. Beim Löschen des Index wird jeweils eine Zeile aus der abgeschlossenen Sortierung abgerufen und der nicht gruppierte Zielindex für jede Zeile aktualisiert.
In einem umfassenden Aktualisierungsplan werden Sie häufig feststellen, dass Spalten vom Operator für die Aktualisierung der Basistabelle zum Zeilenstrom hinzugefügt werden. In diesem Fall fügt das Löschen des gruppierten Index dem Stream Spalten mit nicht gruppierten Indexschlüsseln hinzu. Diese Daten werden von der Speicherengine benötigt, um die zu entfernende Zeile aus dem nicht gruppierten Index zu suchen:
Das Abschneiden ist für eine Tabelle nicht zulässig , die mithilfe der Transaktions- oder Zusammenführungsreplikation veröffentlicht wurde. Wie Löschvorgänge repliziert werden, hängt vom Replikationstyp und der Konfiguration ab. Beispiel: Bei der Snapshot-Replikation wird lediglich eine Ansicht der Tabelle zu einem bestimmten Zeitpunkt mithilfe von Massenmethoden repliziert. Inkrementelle Änderungen werden weder nachverfolgt noch angewendet. Bei der Transaktionsreplikation werden Protokollsätze gelesen und entsprechende Transaktionen generiert, um die Änderungen bei den Abonnenten anzuwenden. Die Replikationszusammenführung verfolgt Änderungen mithilfe von Triggern und Metadatentabellen.
Verwandte Themen: Optimieren von T-SQL-Abfragen, die Daten ändern
quelle