Ok, sagen wir, ich habe 100 Zeilen einzufügen und jede Zeile hat etwa 150 Spalten (ich weiß, das klingt nach vielen Spalten, aber ich muss diese Daten in einer einzigen Tabelle speichern). Die Einfügungen erfolgen zufällig (dh immer dann, wenn eine Gruppe von Benutzern beschließt, eine Datei mit den Daten hochzuladen) etwa 20 Mal pro Monat. Die Datenbank wird jedoch ständig mit der Verarbeitung anderer Funktionen einer großen Unternehmensanwendung belastet. Die Spalten sind Varchars, Ints sowie eine Vielzahl anderer Typen.
Ist der Leistungsgewinn beim Einbetten dieser Einfügungen in eine Transaktion (im Gegensatz zur Einzelausführung) riesig, minimal oder irgendwo dazwischen?
Warum?
BEARBEITEN: Dies ist für Sql Server 2005, aber ich wäre an 2000/2008 interessiert, wenn es etwas anderes zu sagen gibt. Auch sollte ich erwähnen, dass ich den Punkt über Transaktionen verstehe, die hauptsächlich auf Datenkonsistenz abzielen, aber ich möchte mich auf Leistungseffekte konzentrieren.
Es kann tatsächlich eine Auswirkung sein. Bei den Transaktionen geht es nicht darum, wie viele Sie tun, sondern darum, die Datenaktualisierung konsistent zu halten. Wenn Sie Zeilen haben, die zusammen eingefügt werden müssen und voneinander abhängig sind, handelt es sich um die Datensätze, die Sie in eine Transaktion einschließen.
Bei Transaktionen geht es darum, Ihre Daten konsistent zu halten. Dies sollte das erste sein, worüber Sie bei Transaktionen nachdenken. Zum Beispiel, wenn Sie eine Abbuchung von Ihrem Girokonto haben, möchten Sie sicherstellen, dass die Gutschrift (Einzahlung) auch erfolgt. Wenn beide nicht erfolgreich sind, sollte die gesamte "Transaktion" zurückgesetzt werden. Daher müssen beide Aktionen in eine Transaktion eingebunden werden.
Wenn Sie Serieneinsätze durchführen, zerlegen Sie sie in 3000 oder 5000 Datensätze und durchlaufen Sie das Set. 3000-5000 war eine süße Anzahl Bereich für mich für Einsätze; gehen Sie nicht darüber hinaus, es sei denn, Sie haben getestet, dass der Server damit umgehen kann. Außerdem werde ich GOs in den Batch bei etwa 3000 oder 5000 Datensätze für Einsätze setzen. Updates und Löschungen Ich setze ein GO auf etwa 1000, weil sie mehr Ressourcen zum Commit benötigen.
Wenn Sie dies aus C # -Code heraus tun, dann sollten Sie meines Erachtens eine Batch-Import-Routine erstellen, anstatt Millionen von Einfügungen einzeln nacheinander zu programmieren.
Obwohl Transaktionen ein Mechanismus sind, um Daten konsistent zu halten, haben sie tatsächlich einen massiven Einfluss auf die Leistung, wenn sie falsch verwendet oder überstrapaziert werden. Ich habe gerade einen Blogpost über die Auswirkungen auf Leistung von expliziten Angabe von Transaktionen im Gegensatz zu lassen sie natürlich auftreten.
Wenn Sie mehrere Zeilen einfügen und jede Einfügung in einer eigenen Transaktion stattfindet, ist der Aufwand für das Sperren und Entsperren von Daten sehr hoch. Durch die Kapselung aller Einfügungen in einer einzigen Transaktion können Sie die Leistung erheblich verbessern.
Wenn umgekehrt viele Abfragen mit Ihrer Datenbank ausgeführt werden und auch große Transaktionen auftreten, können sie sich gegenseitig blockieren und Leistungsprobleme verursachen.
Transaktionen sind definitiv mit der Leistung verknüpft, unabhängig von ihrer zugrunde liegenden Absicht.
Es hängt davon ab, was Sie als riesig bezeichnen, aber es wird Ihnen helfen (es hängt wirklich von der Gesamtanzahl der Einsätze ab, die Sie tun). Dadurch wird SQL Server gezwungen, nach jeder Einfügung keine Festschreibung durchzuführen, was sich in der Zeit summiert. Bei 100 Einfügungen werden Sie wahrscheinlich nicht viel bemerken, je nachdem, wie oft und was sonst noch mit der Datenbank passiert.
Transaktionen dienen nicht zur Leistung, sondern zur Datenintegrität. Abhängig von der Implementierung wird es wirklich keinen Gewinn / Verlust von Leistung für nur 100 Zeilen geben (sie werden nur zusätzlich protokolliert, so dass sie alle zurückgesetzt werden können).
Zu den Leistungsproblemen zu beachtende Punkte:
Alles in allem: Verwenden Sie TAs, um die Integrität zu gewährleisten.
Wie andere schon gesagt haben, haben Transaktionen nichts mit Leistung zu tun, sondern haben mit der Integrität Ihrer Daten zu tun.
Wenn man darüber spricht, dass man sich über die Leistung auf die eine oder andere Weise Gedanken machen muss, wenn man nur über das Einfügen von 100 Datenzeilen pro Monat (dh 2000 Datensätze pro Monat) spricht, ist das albern. Vorzeitige Optimierung ist Zeitverschwendung; es sei denn, Sie haben wiederholt den Leistungseinfluss dieser Einsätze (so klein wie sie sind, und so selten) und fanden sie ein großes Problem, sorgen Sie sich nicht um die Leistung. Es ist vernachlässigbar im Vergleich zu den anderen Dingen, die Sie als Serverlast erwähnt haben.
Tags und Links sql sql-server database performance transactions