Wie kann ich recycle meine SqliteCommand zu beschleunigen Sqlite bulk insert (iOS)?
Bin ich mit dem code unten, um bulk insert a 30000 Zeilen (1000 Zeilen gleichzeitig). Noch ist es nicht so schnell, wie es sein könnte. In diesem Beispiel Verbesserung der EINSATZ-pro-Sekunde-Leistung von SQLite? ich kann sehen, dass Sie die Erstellung der SqliteCommand
nur einmal und dann reycle es sein, rücksetzen und löschen der Bindungen. Aber ich kann nicht finden die entsprechenden Methoden auf iOS/Monotouch. Es gibt keine Reset()
oder ClearBindings()
oder irgendetwas anderes suchen ähnliche.
using ( var oConn = new SqliteConnection ( "Data Source=" + DB_NAME ) )
{
oConn.Open ( );
//Wrap the whole bulk insertion into one block to make it faster, otherwise one transaction per INSERT would be created.
//Note that this is differen from "BEGIN TRANSACTION" which would increase memory usage a lot!
SqliteCommand oCmd = new SqliteCommand ( "BEGIN", oConn );
oCmd.ExecuteNonQuery ( );
oCmd.Dispose ( );
foreach ( MyObj oObj in aMyObjects )
{
oCmd = new SqliteCommand ( "INSERT INTO LocalObjects ( intID, intParentID, intObjectType, strName, dtModified VALUES (@intID, @intParentID, @intObjectType, @strName, @dtModified)", oConn );
oCmd.Parameters.AddWithValue ( "@intID", oMyObj.ID );
oCmd.Parameters.AddWithValue ( "@intParentID", oMyObj.ParentID );
oCmd.Parameters.AddWithValue ( "@intObjectType", ( int ) oMyObj.Type );
oCmd.Parameters.AddWithValue ( "@strName", oMyObj.Name );
oCmd.Parameters.AddWithValue ( "@dtModified", oMyObj.Modified );
oCmd.ExecuteNonQuery ( );
oCmd.Dispose ( );
}
oCmd = new SqliteCommand ( "END", oConn );
oCmd.ExecuteNonQuery ( );
oCmd.Dispose ( );
oConn.Close ( );
oConn.Dispose ( );
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, ändern Sie Ihren code wie folgt:
Im Grunde, in jeder Schleife jetzt ändern Sie einfach die Werte der Parameter, statt der Konstruktion eine ganz neue Abfrage. Allerdings bin ich mir nicht sicher, ob Ihre Leistung wirklich davon profitieren. Sie müssen versuchen, die.
Können Sie auch versuchen, eine gespeicherte Prozedur zum einfügen von Zeilen. Es sollte schneller sein als inline-Anweisungen vor allem für das einfügen so viele Zeilen.