Nachdem ich diesen Artikel gelesen hatte, entschied ich mich, die Art und Weise, wie ich Dapper verwende, genauer zu betrachten.
Ich habe diesen Code in einer leeren Datenbank ausgeführt
var members = new List<Member>();
for (int i = 0; i < 50000; i++)
{
members.Add(new Member()
{
Username = i.toString(),
IsActive = true
});
}
using (var scope = new TransactionScope())
{
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
scope.Complete();
}
Es dauerte ungefähr 20 Sekunden. Das sind 2500 Einsätze / Sekunde. Nicht schlecht, aber auch nicht großartig, wenn man bedenkt, dass der Blog 45.000 Einsätze pro Sekunde erzielte. Gibt es einen effizienteren Weg, dies in Dapper zu tun?
Als Randnotiz hat die Ausführung dieses Codes über den Visual Studio-Debugger mehr als 3 Minuten gedauert! Ich dachte, der Debugger würde es etwas verlangsamen, aber ich war wirklich überrascht, so viel zu sehen.
AKTUALISIEREN
Also das
using (var scope = new TransactionScope())
{
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
scope.Complete();
}
und das
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
Beide dauerten 20 Sekunden.
Das hat aber 4 Sekunden gedauert!
SqlTransaction trans = connection.BeginTransaction();
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members, transaction: trans);
trans.Commit();
Das Beste, was ich erreichen konnte, war 50k Datensätze in 4 Sekunden mit diesem Ansatz
SqlTransaction trans = connection.BeginTransaction();
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members, transaction: trans);
trans.Commit();
Die Verwendung der Execute
Methode mit nur einer insert-Anweisung führt niemals zu einer Masseneinfügung oder ist effizient. Selbst die akzeptierte Antwort mit einer Transaction
führt keinen Bulk Insert
.
Wenn Sie ein ausführen möchten Bulk Insert
, verwenden Sie die SqlBulkCopy
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy
Sie werden nichts schneller finden.
Disclaimer : Ich bin der Inhaber des Projektes Dapper Plus
Dieses Projekt ist nicht kostenlos, bietet aber alle Bulk-Operationen:
(Verwenden Sie unter der Haube SqlBulkCopy
)
Und einige weitere Optionen wie die Ausgabe von Identitätswerten:
// CONFIGURE & MAP entity
DapperPlusManager.Entity<Order>()
.Table("Orders")
.Identity(x => x.ID);
// CHAIN & SAVE entity
connection.BulkInsert(orders)
.AlsoInsert(order => order.Items);
.Include(x => x.ThenMerge(order => order.Invoice)
.AlsoMerge(invoice => invoice.Items))
.AlsoMerge(x => x.ShippingAddress);
Unsere Bibliothek unterstützt mehrere Anbieter: