gpt4 book ai didi

c# - 许多行的 SQLite 更新非常慢

转载 作者:行者123 更新时间:2023-11-30 14:59:04 26 4
gpt4 key购买 nike

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

我们正在开启交易,像这样:

private SQLiteTransaction BeginTransaction(SQLiteConnection connection)
{
return connection.BeginTransaction();
}

并在类(class)结束时关闭它。我们打开一个连接,一个事务,然后我们更新数据库中的许多行。这意味着我们在相当多的表上累积了许多不同的 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 分钟。

谁能帮我解决这个问题?

最佳答案

我怀疑您没有调用 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 行。在这种情况下,您需要在提交前一个事务后创建一个新事务。

关于c# - 许多行的 SQLite 更新非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17406438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com