2009-06-30 6 views
3

In unserer Anwendung enthält viele Seiten "update" und wenn wir eine Tabelle aktualisieren, aktualisieren wir unnötige Spalten, die auch nicht ändern. Ich möchte wissen, dass es eine Möglichkeit gibt, unnötige Spaltenaktualisierungen zu vermeiden? Wir verwenden gespeicherte Prozeduren in .net 2003. Im folgenden Link fand ich eine Lösung, aber es ist nicht für gespeicherte Prozeduren.Avoiding unnötige Updates in Update-Abfrage

http://blogs.msdn.com/alexj/archive/2009/04/25/tip-15-how-to-avoid-loading-unnecessary-properties.aspx

Dank

+0

Es war mein Verständnis, dass die kleinste Einheit der Arbeit für eine Datenbank eine Zeile war und dass es das gleiche kostet, eine Spalte zu aktualisieren, als sie alle aktualisiert hat. Ich glaube, dass die einzige Ausnahme hiervon Tabellen sein können, die text/ntext- oder blob-Spalten enthalten. – MyItchyChin

+0

nicht unbedingt wahr. Wenn diese Spalten Fremdschlüssel und Indexe haben, könnte es viel mehr Arbeit erforderlich sein, um eine gegebene Zeile zu aktualisieren –

+0

meine Frage ist, welche rdbms? Wenn es SQL 2008 ist, kann eine MERGE-Anweisung helfen. –

Antwort

0

Als ich bei einer Firma für Finanzsoftware arbeitete, war die Leistung entscheidend. Einige Tabellen hatten Hunderte von Spalten und die Update-Anweisungen waren teuer. Wir haben unsere eigene ORM-Schicht (in Java) erstellt, die einen Objekt-Cache enthielt. Beim Generieren der update-Anweisung haben wir die aktuellen Werte aller Felder mit den Werten verglichen, die sie beim Laden hatten, und nur die geänderten Felder aktualisiert.

Unser db war SQLServer. Ich erinnere mich nicht an die Leistungsverbesserung, aber es war beträchtlich und die Investition wert. Wir haben auch Masseneinfügungen und Updates durchgeführt, wo es möglich war.

Ich glaube, dass Hibernate und die anderen großen ORMs diese Art von Sache für Sie tun, wenn Sie nicht selbst einen schreiben wollen.

+0

Sie haben Recht, ORM ist der beste Weg dafür –

1

Sie können wirklich nur dies erreichen mit einem guten ORM-Tool, das für Sie die Update-Abfrage generiert. In der Regel wird untersucht, was die Abfrage geändert und nur für die Spalten generiert hat, die geändert wurden.

Wenn Sie eine gespeicherte Prozedur verwenden, werden alle Spaltenwerte trotzdem an die Datenbank gesendet, wenn Sie die gespeicherte Prozedur aufrufen, sodass Sie dort nicht speichern können. Der SP wird wahrscheinlich nur eine UPDATE-Anweisung ausführen. Das RDMS übernimmt dann. Die Daten auf der Disc werden nicht physisch geändert, wenn sie nicht anders sind. Es ist schlau genug dafür.

Also meine Antwort kurz: mach dir keine Sorgen darüber. Es ist nicht wirklich eine große Sache und erfordert drastische Änderungen, um zu bekommen, was Sie wollen, und Sie sehen nicht einmal Leistungsvorteile.

+0

das ist absolut nicht wahr. Die meisten db-Engines führen das Update unabhängig aus. Sie sind immer noch Transaktionsverfolgung, Änderungsprotokollierung (falls implementiert), Indexaktualisierungen und Fremdschlüsselprüfungen. Das Aktualisieren nicht benötigter Spalten kann definitiv Auswirkungen haben, insbesondere wenn diese Spalten indiziert werden, noch schlimmer, wenn sie Teil des gruppierten Indexes sind. –

+0

Ich glaube, dass Hibernate/NHibernate das aus der Box tun wird. Es überprüft, ob ein Objekt "fehlerhaft" ist (Änderungen an seinen Eigenschaften) und erstellt dann eine eigene SQL-Anweisung, um die entsprechenden Spalten zu aktualisieren. Zugegeben, Sie erhalten auch den zusätzlichen Aufwand für die Ausführung eines ORM-Frameworks. Wenn sich das Framework jedoch nicht auf demselben Server wie die Datenbank befindet, kann dies hilfreich sein. –