In diesem Artikel erfahren Sie verschiedene Methoden, mit denen die Daten in einer Tabelle mit den Daten anderer Tabellen aktualisiert werden. Die Abfragestruktur „UPDATE from SELECT“ ist die Hauptmethode für die Durchführung dieser Updates.
Eine Aktualisierungsabfrage wird verwendet, um eine vorhandene Zeile oder Zeilen in der Datenbank zu ändern. UPDATE-Abfragen können alle Tabellenzeilen ändern, oder wir können die Auswirkungen der Update-Anweisung für die bestimmten Zeilen mit Hilfe der WHERE-Klausel begrenzen., Meistens verwenden wir konstante Werte, um die Daten zu ändern, z. B. die folgenden Strukturen.
Die vollständige update-Anweisung wird verwendet, um die gesamten Tabellendaten mit demselben Wert zu ändern.,
1
2
|
UPDATE table
SET col1 = constant_value1 , col2 = constant_value2 , colN = constant_valueN
|
The conditional update statement is used to change the data that satisfies the WHERE condition.,
1
2
3
|
Tabelle AKTUALISIEREN
SETZEN SIE col1 = const_vvalue1 , col2 = const_vvalue2 , colN = const_valuen
WOBEI col = val
|
Für verschiedene Szenarien kann dieser Konstantwertnutzungstyp für uns jedoch nicht ausreichen, und wir müssen verwenden Sie die Daten anderer Tabellen, um unsere Tabelle zu aktualisieren., Diese Art von Update-Anweisungen ist etwas komplizierter als die üblichen Strukturen. In den folgenden Abschnitten erfahren Sie, wie Sie diese Art von Aktualisierungsabfrage mit verschiedenen Methoden schreiben, aber zunächst müssen wir unsere Beispieldaten vorbereiten. Also lass uns das tun.
Vorbereiten der Beispieldaten
Mit Hilfe der folgenden Abfrage erstellen wir Personen-und AddressList-Tabellen und füllen sie mit einigen synthetischen Daten. Diese beiden Tabellen haben eine Beziehung über die PersonId-Spalte, was bedeutet, dass in diesen beiden Tabellen der PersonId-Spaltenwert dieselbe Person darstellt.,
UPDATE from SELECT: Join Method
Bei dieser Methode wird die zu aktualisierende Tabelle mit der Referenztabelle (sekundär) verknüpft, die neue Zeilenwerte enthält. Damit können wir basierend auf dem angegebenen Join-Typ auf die übereinstimmenden Daten der Referenztabelle zugreifen. Schließlich können die zu aktualisierenden Spalten mit referenzierten Spalten abgeglichen werden, und der Aktualisierungsprozess ändert diese Spaltenwerte.
Im folgenden Beispiel aktualisieren wir die Spaltendaten PersonCityName und PersonPostCode mit den Spaltendaten City und PostCode der Tabelle AdressList.,
1
2
3
4
5
6
7
8
|
UPDATE Per
SET
Per.PersonCityName=Addr.City,
Per.PersonPostCode=Addr.PostCode
FROM Persons Per
INNER JOIN
AddressList Addr
ON Per.PersonId = Addr.,
Nach der Ausführung des Updates aus einer Select-Abfrage wird die Ausgabe der Personentabelle wie unten gezeigt;
Versuchen wir es um den obigen Code zu verstehen: haben wir den Tabellennamen eingegeben, der nach der UPDATE-Anweisung aktualisiert wird., Nach dem Schlüsselwort SET haben wir die zu aktualisierenden Spaltennamen angegeben und sie mit den referenzierten Tabellenspalten abgeglichen. Nach der FROM-Klausel haben wir den Tabellennamen erneut eingegeben, der aktualisiert wird. Nach der INNEREN JOIN-Klausel haben wir die referenzierte Tabelle angegeben und mit der zu aktualisierenden Tabelle verknüpft. Darüber hinaus können wir eine WHERE-Klausel angeben und alle Spalten der referenzierten oder aktualisierten Tabelle filtern. Wir können die Abfrage auch mithilfe von Aliasen für Tabellen umschreiben.,
Leistungstipp:Indizes sind sehr hilfreiche Datenbankobjekte zur Verbesserung der Abfrageleistung in SQL Server. Insbesondere wenn wir an der Leistung der Update-Abfrage arbeiten, sollten wir diese Wahrscheinlichkeit berücksichtigen. Der folgende Ausführungsplan veranschaulicht einen Ausführungsplan der vorherigen Abfrage. Der einzige Unterschied besteht darin, dass diese Abfrage die 3.000.000 Zeilen der Personentabelle aktualisiert hat. Diese Abfrage wurde innerhalb von 68 Sekunden abgeschlossen.,
Wir haben vor der Aktualisierung einen nicht gruppierten Index für die Personentabelle hinzugefügt, und der hinzugefügte Index enthält die Spalten PersonCityName und PersonPostCode als Indexschlüssel.
Der folgende Ausführungsplan zeigt einen Ausführungsplan derselben Abfrage, aber diese Abfrage wurde im Gegensatz zum ersten innerhalb von 130 Sekunden abgeschlossen des hinzugefügten Index.
Die Indexupdate-und Sortieroperatoren verbrauchen 74% der Kosten des Ausführungsplans., Wir haben diesen offensichtlichen Leistungsunterschied zwischen derselben Abfrage aufgrund der Indexnutzung für die aktualisierten Spalten festgestellt. Wenn die aktualisierten Spalten beispielsweise von den Indizes verwendet werden, kann die Abfrageleistung negativ beeinflusst werden. Insbesondere sollten wir dieses Problem berücksichtigen, wenn wir eine große Anzahl von Zeilen aktualisieren. Um dieses Problem zu beheben, können wir den Index deaktivieren oder entfernen, bevor wir die Aktualisierungsabfrage ausführen. Andererseits ist am Sortieroperator ein Warnzeichen zu sehen, das anzeigt, dass für diesen Operator etwas nicht gut läuft., Wenn wir mit der Maus über diesen Operator fahren, können wir die Warndetails sehen.
Während der Ausführung der Abfrage berechnet der Abfrageoptimierer basierend auf den geschätzten Zeilennummern und der Zeilengröße den erforderlichen Speicherverbrauch für die Abfrage. Diese Verbrauchsschätzung kann jedoch aus verschiedenen Gründen falsch sein, und wenn die Abfrage mehr Speicher als die Schätzung benötigt, werden die tempdb-Daten verwendet. Dieser Mechanismus wird als Tempdb-Spill bezeichnet und verursacht Leistungsverlust., Der Grund dafür: Der Speicher ist immer schneller als die tempdb-Datenbank, da die tempdb-Datenbank die Festplattenressourcen verwendet. Sie können diesen SQL Server 2017: SQL Sort, Spill, Memory und Adaptive Memory Grant Feedback fantastischen Artikel für weitere Details über das tempdb spill Problem sehen. UPDATE from SELECT: Die MERGE-AnweisungDie MERGE-Anweisung wird verwendet, um eine Zieltabelle zu bearbeiten (EINFÜGEN, AKTUALISIEREN, LÖSCHEN), indem auf eine Quelltabelle für die übereinstimmenden und nicht übereinstimmenden Zeilen verwiesen wird. Die MERGE-Anweisung kann sehr nützlich sein, um die Tabelle aus einer beliebigen Quelltabelle zu synchronisieren., Wenn wir nun zu unserer Position zurückkehren, kann die MERGE-Anweisung als alternative Methode zum Aktualisieren von Daten in einer Tabelle mit denen in einer anderen Tabelle verwendet werden. Bei dieser Methode kann die Referenztabelle als Quelltabelle betrachtet werden, und die Zieltabelle ist die zu aktualisierende Tabelle. Die folgende Abfrage kann ein Beispiel für diese Verwendungsmethode sein.,
Jetzt packen wir das Vorherige update von einer select-Abfrage eine Zeile.,
haben wir die Personentabelle nach der MERGE-Anweisung eingegeben, da es sich um unsere Zieltabelle handelt, die wir aktualisieren möchten, und wir haben ihr einen Alias gegeben, um den Rest der Abfrage zu verwenden.,
After the USING statement, we have specified the source table.
Mit Hilfe dieser syntax, die join-Bedingung definiert ist, zwischen der Ziel-und Quelltabelle.
In dieser letzten Zeile der Abfrage haben wir uns für die manipulation Methode für die übereinstimmenden Zeilen. Individuell für diese Abfrage haben wir die Aktualisierungsmethode für die übereinstimmenden Zeilen der Zieltabelle ausgewählt. Schließlich haben wir das Semikolon (;) – Zeichen hinzugefügt, da die MERGE-Anweisungen mit den Semikolon-Zeichen enden müssen. UPDATE from SELECT: UnterabfragemethodeEine Unterabfrage ist eine interne Abfrage, die innerhalb der DML-Anweisungen (SELECT, INSERT, UPDATE und DELETE) verwendet werden kann., Das Hauptmerkmal der Unterabfrage ist, dass sie nur mit der externen Abfrage ausgeführt werden können. Die Unterabfragemethode ist die sehr einfache und einfache Methode, um vorhandene Daten aus den Daten anderer Tabellen zu aktualisieren. Der merkliche Unterschied bei dieser Methode besteht darin, dass es möglicherweise eine bequeme Möglichkeit ist, eine Spalte für die Tabellen mit einer kleinen Anzahl von Zeilen zu aktualisieren. Jetzt führen wir die folgende Abfrage aus und analysieren sie dann.,
|