我相信我用了很多方法來加速很多行的更新, 但是到目前爲止沒有什麼幫助。很多行的SQLite更新很慢
我們打開的是交易, 這樣的:
private SQLiteTransaction BeginTransaction(SQLiteConnection connection)
{
return connection.BeginTransaction();
}
,並在課程結束時將其關閉。 我們打開一個連接,一個事務,然後我們更新數據庫上的很多行。 這意味着我們在許多表中累積了許多不同的SQL語句。
其中很大一部分是12000條記錄在一個表中
protected override void UpdateRows(SQLiteConnection connection, IEnumerable<DataRow> rowsToUpdate)
{
var command = new SQLiteCommand(Queries.SQLUpdateDocument, connection);
foreach (DataRow documentRow in rowsToUpdate)
{
command.Parameters.AddWithValue("@Filename", documentRow[Constants.Col_Document_Filename]);
command.Parameters.AddWithValue("@ClassID", documentRow[Constants.Col_Document_ClassID]);
command.Parameters.AddWithValue("@PageCount", documentRow[Constants.Col_Document_PageCount]);
command.Parameters.AddWithValue("@DocID", documentRow[Constants.Col_Document_GlobalDocID]);
command.Parameters.AddWithValue("@ReadOnly", documentRow[Constants.Col_Document_ReadOnly]);
command.Parameters.AddWithValue("@Confirmed", documentRow[Constants.Col_Document_Confirmed]);
command.Parameters.AddWithValue("@ParentFolderID", documentRow[Constants.Col_Document_ParentFolderID]);
command.Parameters.AddWithValue("@SequenceNumber", documentRow[Constants.Col_Document_SequenceNumber]);
command.Parameters.AddWithValue("@XmlRepr", documentRow[Constants.Col_Document_XmlRepr]);
command.ExecuteNonQuery();
documentRow.AcceptChanges();
}
}
與查詢beeing更新:
UPDATE T_Doc SET
Filename = @Filename,
ClassID = @ClassID,
PageCount = @PageCount,
ReadOnly = @ReadOnly,
Confirmed = @Confirmed,
ParentFolderID = @ParentFolderID,
SequenceNumber = @SequenceNumber,
XmlRepr = @XmlRepr
WHERE ID = @DocID;
中的AcceptChanges()並不需要很長時間。 ExecuteNonQuery()比預期的要慢得多。
PRAGMA foreign_keys = ON;
更新命令和的ClassID和ParentFolderID參考其他表之前已被執行。
無論如何 - 更新速度非常慢,更新12000條記錄需要15-30分鐘。
有人可以幫我嗎?
您的表格是否由ID字段索引?如果你能展示你如何組織表格,這可能有助於理解問題的根源。 – athabaska
嘗試使用事務模型:open transaction-> execute ** all ** comands-> commit transaction。 – Tigran
@athabaska ID是主鍵。 SQLite將自動創建主鍵。 – HankTheTank