SQL (server) Aktualisierungsleistung

Meine begrenzte SQL-Kenntnisse haben diesen Beitrag veranlasst!

Ich habe eine gespeicherte Prozedur, die eine Reihe von Updates läuft.
Es gibt 6 Update-statementen, die sehr gut in eine große Update-statement verputzt werden können, aber ich weiß nicht, was das für die performance bedeutet.

Tabellengrundlagen: 6 Tische werden getroffen. 3 davon werden nie mehr als etwa 5000 Platten haben, von denen 3 unbegrenzt wachsen (derzeit rund 1-2 Millionen Platten, richtig indiziert, etc.). Gibt es einen Geschwindigkeitsvorteil, um alle Tische anzuschließen und eine massive Update-statement zu machen, um es als 6 separate Updates zu halten?

Ich suche den effizientesting path, es zu tun, auch wenn es eine zweite abrasiert.

Vielen Dank.

BEARBEITEN:

Ich entschuldige mich für alle. Ich aktualisiere nur eine einzelne Tabelle, aber die Überprüfung von data von allen 6, um die eine Tabelle zu aktualisieren. (dh prüfen, ob table2.somevalue leer ist, dann markieren Sie den datasatz in table1 als "error")

Wenn es möglich ist, sie zu kombinieren, dann ja, sollten Sie sie kombinieren.

Wenn Sie mehrere Spalten aus einer einzigen Tabelle aktualisieren, dann kombinieren Sie sie wie:

UPDATE mytable SET foo = bar, fizz = buzz, whiz = bang WHERE zing > 2081 

Anstatt von

 UPDATE mytable SET foo = bar WHERE zing > 2081 UPDATE mytable SET fizz = buzz WHERE zing > 2081 UPDATE mytable SET whiz = bang WHERE zing > 2081 

Das ist fast 3x so effizient, weil es nur einmal durch den Tisch gehen muss.

Updates von Feldern in verschiedenen Tabellen müssen separat durchgeführt werden (wie Cade Roux erwähnt, es ist nicht einmal möglich , sie zur gleichen time zu tun).

Auch wenn Sie einen komplexen Join verwenden, kann nur eine einzige Tabelle aktualisiert werden. Etwas wie:

 UPDATE AccountHistory SET LastPurchaseDate = i.PurchaseDate FROM Account a INNER JOIN AccountHistory h ON a.AccountID = h.AccountID INNER JOIN Invoices i ON i.AccountID = a.AccountID WHERE i.PurchaseDate > '2009-11-30' 

Nur AccountHistory wird hier geändert, obwohl die Quelldaten über eine Verknüpfung zugegriffen werden.

Dies ist nicht einmal möglich (Aktualisierung mehrerer Tabellen gleichzeitig in einer einzigen UPDATE-statement) in T-SQL.

Von BOL :

Tabellenname

Ist der Name der Tabelle zu aktualisieren. Der Name kann mit dem verknüpften server, der database und dem Eigentümernamen qualifiziert werden, wenn sich die Tabelle nicht im aktuellen server oder der database befindet oder nicht im Besitz des aktuellen Benutzers ist.

und

view_name

Ist der Name der view zu aktualisieren. Die von view_name verwendete view muss aktualisierbar sein. Die von der UPDATE-statement vorgenommenen Änderungen können nicht mehr als eine der Basistabellen beeinflussen, auf die in der FROM-Klausel der view verwiesen wird.

Sie können keine gute Antwort mit den gelieferten data bekommen – Sie müssen bei jedem Update verstehen, wenn die Kriterien indiziert sind und was die Kombination mit der Aktualisierungskomplexität macht.

Ich denke, dass 6 Updates (in einer Transaktion, wenn nötig) verständlicher sind als 1 großes Update – also ist es eine bessere Lösung, und du kannst jedes Update so schnell wie möglich optimieren.

JRud Kommentar ist gut – man kann immer versuchen, beide path und vergleichen timeen.

Signifikante performancesverbesserungen können typischerweise durch Gruppieren von Abfragen erreicht werden, wenn die Abfragen von einem [Remote] -Client kommen . In Ihrer Situation kommen die Mehrfachabfragen von einer gespeicherten Prozedur, und daher sind es leicht lokale Anfragen, und die Vorteile der Kombination von ihnen werden nicht signifikant sein, wenn überhaupt.

Darüber hinaus ist es bei der Überprüfung der SQL-Dokumentation im Fall von UPDATEs nicht möglich, eine Abfrage zu schreiben, die mehr als eine Tabelle zu einem timepunkt modifiziert

Da Sie jedoch die effizienteste Art suchen, müssen Sie verschiedene Möglichkeiten (unter einem repräsentativen Satz von dataeingaben) ausprobieren , um die Auswirkungen bestimmter Änderungen zu sehen. In Abwesenheit von mehr Details über Ihre spezifische Situation, ist es schwer, mehr gezielte Informationen anzubieten.

Ein kleiner und generischer Hinweis:
Die Erwähnung von "richtig indiziert" in Bezug auf die "großen" Tabellen, ist eine Erinnerung, dass, wenn es um UPDATEs geht (und allgemeiner schreiben Operationen wie Löschen und Einfügungen), Indizes können mehr eine Haftung, dass ein Vermögenswert, Performance- weise.

Auch wenn es gibt, würde ich nicht empfehlen, das grundlegende Tabellenschema zu modifizieren, um die performance um einen kleinen Prozentsatz zu erhöhen. Wenn eine Veränderung eine große Veränderung in der performance, (wie doppelt oder dreifach) dann in Situationen, in denen performance kritisch ist, könnte es sich aber lohnen,

Mit fast allen modernen databasepaketen stehen Ihnen zahlreiche weitere Techniken zur Verfügung, die die performance erhöhen, ohne das grundlegende Tabellenschema zu ändern. Sie können Indizes hinzufügen, die auf die Arten von Abfragen angepasst sind, die Ihre Anwendung verwendet. Unter anderen Techniken können Sie indizierte viewen hinzufügen (materialisierte viewen in Oracle). Sie können vertikal und / oder horizontal trennen. In SQL Serve können Sie "PIN" kleine Tische, so dass sie im memory bleiben die ganze time.

Versuchen Sie, die Gesamtleistung der gespeicherten Prozedur zu verbessern oder die time zu reduzieren, die die UPDATEs nehmen?

In Fällen, in denen ich mehr Sorgen um concurrency (Verringerung der Sperrzeit) als die Gesamtleistung, werde ich SELECT die Schlüsselwerte in variables oder temporäre Tabellen. Dann verwende ich die variables oder temporären Tabellen im UPDATE. Der "Fokus" kann die UPDATE-Performance erheblich verbessern.

Caveat: mit dieser Methode erfordert ein gutes Verständnis davon, wie Ihr System funktioniert. Das größte Risiko bei dieser Methode ist die Erhöhung der Chancen der Deadlocks.