Announcement

Collapse
No announcement yet.

Wie am schnellsten 10.000 Werte updaten?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie am schnellsten 10.000 Werte updaten?

    Hallo

    Über eine Schleife schreib ich folgende SQL Befehle in eine MS SQL:
    [highlight=sql]Update Adressen Set grpAudio='{0}', grpVideo='{1}', grpMedientechnik='{2}', grpGLT='{3}', NewsletterAnmeldedatum={4}, NewsletterAbmeldedatum={5}, NewsletterStatus={7} where Email='{6}';[/highlight]

    Die {} bitte ignorieren, da diese vor dem schreiben richtig gesetzt werden.

    Nun habe ich 10.000 Einzelanweisungen.
    Ich habe nun mal 100 Anweisungen in einer SQL verpackt und bin schon deutlich schneller.

    Jedoch wie viele Update Anweisungen verträgt ein SQL Befehl?
    Kann ich alle 10.000 oder gar 50.000 auf einmal senden?

    Danke!
    Zuletzt editiert von gfoidl; 24.07.2013, 20:30. Reason: SQL-Tags

  • #2
    http://msdn.microsoft.com/en-us/library/ms143432.aspx
    Der max. Batchgröße liegt also ungefähr bei 256MB.

    Aber wieso probierst du es nicht einfach aus? Wenn du 100 probiert hast solltest es ein leichtes auch mehr zu probieren.

    Comment


    • #3
      ich stelle mir die frage, was sich in deinen SQL-Anweisungen denn alles ändert, wenn du 10.000 oder gar 50.000 einzelne anweisungen schreiben willst/musst?

      damit meine ich, dass es vielleicht sogar einfacher ist jeweils einzelne SQL anweisungen abzusenden die nur jeweils die entsprechenden spalten updaten und die dazu passenden emails.
      also:
      [highlight=SQL]
      UPDATE Adressen SET grpAudio='{0}' WHERE (Email='{1}') OR (Email='{2}') ... ;
      UPDATE Adressen SET grpVideo='{0}' WHERE (Email='{1}') OR (Email='{2}') ... ;
      [/highlight]

      Klar lässt sich dieses Prinzip nicht auf alle Spalten übernehmen (vermute ich z.B. bei NewsletterAnmeldedatum), reduziert aber bestimmt die Anzahl der unnützen Updates.

      PS: Falls du String.Format verwendest, würde ich empfehlen mal zu prüfen ob du eine normale stringverkettung zeit sparen kannst.
      in einem früheren Projekt habe ich festgestellt, dass String.Format meinen Code enorm verlangsamte und "UPDATE Adressen SET grpAudio='"+array[0]+"', ..." super schnell lief

      Comment


      • #4
        PS: Falls du String.Format verwendest, würde ich empfehlen mal zu prüfen ob du eine normale stringverkettung zeit sparen kannst.
        in einem früheren Projekt habe ich festgestellt, dass String.Format meinen Code enorm verlangsamte und "UPDATE Adressen SET grpAudio='"+array[0]+"', ..." super schnell lief
        Dafür würde ich gern mal ein nachvollziehbares Beispiel sehen. String.Format benutz intern einen StringBuilder hat also nicht das immutable Problemchen einfacher Strings. Das sollte gefühlt immer schneller sein als simple String concatenation wo ständig Kopien des Strings angelegt werden müssen.

        Aber egal beim Zusammenbauen des Statements sollte deutlich weniger Performanceoptimierungpotential liegen als im Netzwerk Ping-Pong zwischen Datenbank und Prozess. Je Statement gibts da vielleicht Potential im Mikrosekunden Bereich. Während jeder eingesparrte Netzwerk Ping-Pong eher im 2stlligen Millisekunden Bereich liegt.

        Comment


        • #5
          Hallo

          Ok, ich teste mal 5.000 Werte auf einmal.

          Die Routine in vb.net läuft selbst sehr schnell. Wenn ich die SQL Übetragung auskommentiere, habe ich fast kein Problem.

          @nooa:
          Du meinst ich soll zuerst abrufen, schauen ob es änderungen gibt und nur die zurückschreiben? Daran habe ich auch schon mal gedacht. Würde auch den SQL Server entlasten.
          Das Teste ich mal in den nächsten Wochen.

          Dank!

          Comment

          Working...
          X