Frage

Ich habe endlich meinen Einsatz Charge Arbeit bekommen und jetzt habe ich mit der Größe des Ansatzes wurde das Hantieren, aber ich kann keinen Unterschied in der Leistung zwischen einem Wert von 50 und einem Wert von 10000. Dies scheint sehen sehr seltsam für mich, aber ich weiß nicht, was hinter den Kulissen passiert, so dass es ein normales Verhalten sein könnte.

Ich bin Einfügen 160k Zeilen in eine Tabelle und die mittlere Zeit für meine getesteten Werte beträgt 115 +/- 2 Sekunden. Ohne Dosieren dauert es 210 Sekunden, also bin ich ganz mit der Verbesserung zufrieden. Die Zieltabelle ist:

CREATE TABLE [dbo].[p_DataIdeas](
    [wave] [int] NOT NULL,
    [idnumber] [int] NOT NULL,
    [ideaID] [int] NOT NULL,
    [haveSeen] [bit] NOT NULL CONSTRAINT [DF_p_DataIdeas_haveSeen]  DEFAULT ((0)),
  CONSTRAINT [PK_p_DataIdeas] PRIMARY KEY CLUSTERED 
(
  [wave] ASC,
  [idnumber] ASC,
  [ideaID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON
) ON [PRIMARY]
) ON [PRIMARY]

lese ich Was zu suchen, wenn Einstellung Update und die Antwort war einfach ein paar verschiedene Werte zu testen. Ich kann das verstehen, aber soll es nicht möglich sein, einen guten Wert zu berechnen oder zumindest guesstimate wenn Sie die Tabelle Design kennen, die SQL-Frage und die Daten, die über sind eingefügt werden?

Gibt es Best Practices da draußen kann, dass jemand empfehlen?

War es hilfreich?

Lösung

Sie können den Effekt der Dosierung sehen entweder in SQL Profiler oder durch SqlConnection.RetrieveStatistics() aufrufen. Was sollten Sie sehen, ist, dass jede Charge entspricht einem einzigen Roundtrip an die DB.

Soweit wie die Chargengröße zu optimieren, ein sehr grober Regel-of-Daumen ist, dass die Leistung zu stoppen neigt oberhalb von etwa 50 mit Losgrößen zu verbessern - in der Tat können manchmal größere Chargen laufen langsamer als kleinere. Wenn ich zu beschäftigt, um Test bin ich in der Regel mit einer Charge von etwa 20 beginnen (es sei denn, ich Tabellenwertparameter bin mit, wo Chargen bis zu 500 schneller sein können als kleinere). Allerdings hängt die optimale Anzahl an Dinge wie die Gesamtgröße der Einsätze (alle werden sie in den Arbeitsspeicher passen), wie schnell die Scheiben sind, dass Ihr DB-Log befindet sich auf ist, ob das Protokoll auf einem Laufwerk / LUN seiner eigenen ist ( groß perf Kosten, wenn es nicht), etc.

Die erreichbare Geschwindigkeit ist in der Regel begrenzt zunächst durch die Anzahl der Umläufe, dann durch Transaktionsgröße, dann Plattengeschwindigkeit lügt (insbesondere ob sequenzieller Zugriff möglich ist oder wenn es mit anderen Dateien auf den gleichen Spindeln zufällig aufgrund der Konkurrenz gezwungen wird) und schließlich RAM. alle Faktoren, aber auch miteinander verbunden zu einem gewissen Grad.

Der erste Schritt, um die perf Ihrer Einsätze bei der Verbesserung wäre, sich in Transaktionen zu tun - vielleicht eine Transaktion jede Charge oder zwei. Darüber hinaus, Tabellenwertparameter ist wahrscheinlich der nächste Schritt, um eine gespeicherte Prozedur mit INSERT INTO Table SELECT column FROM @TableArgument verwendet wird.

Andere Tipps

Obwohl Update Wechsel zu einem gewissen Grad helfen, der grundlegende Ansatz eines Dataadapter verwendet viele Datensätze zu aktualisieren wird langsam sein. Dies liegt daran, letztlich eine separate SQL-Anweisung (Einfügen, Aktualisieren oder Löschen) wird von dem Dataadapter für jede Zeile erzeugt werden. Update wirkt sich nur, wie viele dieser einzelnen Aussagen in einem TSQL Batch gesendet werden, wenn an SQL Server gesendet.

Um viel größere Verbesserungen in der Leistung zu erhalten, wollen Sie SQLServer insert / update / delete viele Datensätze in einer Anweisung (in der Regel ein mit irgendeiner Art JOIN). Tabellenwertparameter (wie durch RickNZ genannt) ist eine Möglichkeit, dies zu tun. Eine weitere Möglichkeit ist mit SqlBulkCopy (obwohl Sie in der Regel müssen eine Staging-Tabelle für diese verwenden).

Stellen Sie sicher, dass es auch eine aktive Transaktion ist es, die Leistung verbessern wird erheblich (ca. 30x in meinen Tests mit MySqlDataAdapter).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top