Wie viel hilft das Einbetten von Einfügungen in einer Transaktion bei der Leistung auf Sql Server?

8

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.

    
Mark Rogers 06.02.2009, 19:46
quelle

5 Antworten

16

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.

    
SnapJag 05.03.2009, 01:29
quelle
5

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.

    
Luke McGregor 25.04.2012 13:52
quelle
2

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.

    
kemiller2002 06.02.2009 19:50
quelle
2

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:

  • TAs interagieren mit anderen Abfragen
    • schreiben TAs sperren Tupel / Seiten / Dateien
  • commits kann (abhängig vom Sperrprotokoll) nur eine Aktualisierung eines Zeitstempels sein
  • mehr Protokolle könnten für TAs geschrieben werden (man sollte TAs zurückrollen können, aber die Datenbank protokolliert möglicherweise bereits umfangreich, sequentielle Protokollierung ist billig)
  • der Grad der Isolation (Ich weiß, dass man in einigen DBs dieses Level wechseln kann - und dass fast niemand Level 3 benutzt)

Alles in allem: Verwenden Sie TAs, um die Integrität zu gewährleisten.

    
Leonidas 06.02.2009 19:51
quelle
2

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.

    
Ken White 06.02.2009 20:38
quelle