Ich hoffe Laurion Burchall liest diese :-)eine Million kleine Datensätze in Extensible Storage Engine (JetBlue) einlegen - schnell
Ich muss so schnell wie möglich eine Million winziger Datensätze einzufügen.
Im Moment bin ich in einer sehr engen Schleife, wo für jeden Datensatz, ich
a) start a transaction (JetBeginTransaction)
b) prepare an update (JetPrepareUpdate)
c) add the row (JetSetColumns)
d) commit the transaction (JetCommitTransaction)
Gerade jetzt, während dieses Prozesses habe ich auf einem Prozessor in einer engen Schleife bin. Die Zielmaschine hat mehrere CPUs, große Festplatten und viel freien RAM.
Ich frage mich, wie man bessere Leistung bekommt.
Soweit Transaktionen gehen, habe ich einige Experimente und hatte Probleme, wo Fehler zurückkamen, wenn ich zu viele Daten in einer Transaktion. Ich würde gerne besser verstehen, was dort vor sich geht - habe ich einen Fehler, oder ist die Größe einer Transaktion begrenzt? Kann ich die Obergrenze vergrößern? Ich untersuche das nur, weil ich vermute, dass eine Transaktion ESE die Möglichkeit gibt, mehr Zwischenspeicher im RAM zu machen, was das Löschen von Festplatten minimiert? - Das ist nur eine Vermutung?
Im Allgemeinen, wie benutze ich mehrere Prozessoren/viel RAM/und nette Festplatten? öffne ich die Datenbank zweimal und gehe von dort? Ich bin mir nicht sicher, was in Bezug auf Thread-Sicherheit und Transaktionen passiert. Wenn ich zwei Handles zur Datenbank habe, jeder in einer Transaktion, wird ein Schreiben auf einen Handle unmittelbar vor dem Commit für den zweiten verfügbar sein, oder muss ich zuerst Commit machen?
sind alle Tipps
here are the constraints
a) I've got a million records that need to be written into the DB as fast as possible
b) to fully generate the record for insertion there are two searches that need to occur within the same table (seeking keys)
c) This is a rebuild/regeneration of the DB - it either worked, or it didnt.
If it didnt there is no going back, a fresh rebuild/regeneration is
needed. I cannot restart mid process and without all the data none of
the data is valuable. READ: having one big transaction is fine if it
improves perf. I'd like ESE to cache, in ram, if that helps perf.
Dank geschätzt!
vielen dank! – stuck
Hier ist ein Link zu einem Dokument Laurion auf MSDN http://blogs.msdn.com/b/laurionb/archive/2008/11/07/some-basic-esent-performance-measurements.aspx – stuck
Ich bin nicht die Perfusion bekommen, die ich gerne sehen würde. Ich kann ~ 10.000 sehr kleine Aufzeichnungen in ungefähr 4.3sec auf einer netten Maschine (i7 mit 7200 SATA-Scheibe) hinzufügen. Das Problem tritt nur auf, wenn der Datenbank eine einzelne, eindeutige Zeichenfolge ungleich null hinzugefügt wird. Ich sehe niedrige CPU-Auslastung und viele kleine Schreibvorgänge beim Überwachen mit Procmon. Das erscheint mir angesichts der geringen Größe der Aufzeichnungen? Ich rufe JetCommitTransaction (JET_bitCommitLazyFlush). Alles vorausgesetzt (Lazy Flush + großer maxVerPage-Wert + niedrige CPU-Last + kleine IOs, gemessen in procmon). Etwas das ich tun kann? Angenommen, die Bewegung der Platte ist wahrscheinlich? – stuck