SQLite对许多行的更新非常缓慢

本文关键字:非常 缓慢 更新 许多行 SQLite | 更新日期: 2023-09-27 18:20:45

我相信我已经用了很多方法来加快许多行的UPDATE,但到目前为止没有任何帮助。

我们正在进行交易,像这样:

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();
    }
}

带查询框:

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;

已在update命令执行之前执行,并且ClassID和ParentFolderID引用其他表。

无论如何,更新速度非常慢,更新12000条记录大约需要15-30分钟。

有人能帮我吗?

SQLite对许多行的更新非常缓慢

我怀疑您没有调用BeginTransaction,或者可能没有将命令与事务关联。。。如果没有显式指定事务,则每次执行命令时都会隐式创建一个新事务。

试试这个:

protected override void UpdateRows(SQLiteConnection connection, IEnumerable<DataRow> rowsToUpdate)     
{
    using (var command = new SQLiteCommand(Queries.SQLUpdateDocument, connection))
    using (var transaction = connection.BeginTransaction())
    {
        command.Transaction = transaction;
        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();
        }
        transaction.Commit();
    }
}

请注意,如果您有大量的行,您可能希望在更新所有内容之前提交,例如每1000行。在这种情况下,您需要在提交前一个事务之后创建一个新事务。