c# - SqLite C# 更新速度极慢

标签 c# sqlite executenonquery journal

我真的很努力解决这个问题。当我使用以下代码更新数据库中的大量记录时,它运行速度非常慢。我有 500,000 条记录需要更新,这需要近一个小时。在此操作期间,日志文件增长缓慢,主 SQLite db3 文件几乎没有变化 - 这是正常的吗?

只有当我有大量或记录需要更新时,该操作才会出现问题 - 它几乎可以立即在较少数量的记录上运行。

在此代码运行之前,会在数据库上执行一些其他操作,那么它们是否会占用数据库?我已尝试确保所有其他连接均已正确关闭。

感谢您的建议

using (SQLiteConnection sqLiteConnection = new SQLiteConnection("Data Source=" + _case.DatabasePath))
{
    sqLiteConnection.Open();
    using (SQLiteCommand sqLiteCommand = new SQLiteCommand("begin", sqLiteConnection))
    {
        sqLiteCommand.ExecuteNonQuery();
        sqLiteCommand.CommandText = "UPDATE CaseFiles SET areaPk = @areaPk, KnownareaPk = @knownareaPk WHERE mhash = @mhash";
        var pcatpk = sqLiteCommand.CreateParameter();
        var pknowncatpk = sqLiteCommand.CreateParameter();
        var pmhash = sqLiteCommand.CreateParameter();
        pcatpk.ParameterName = "@areaPk";
        pknowncatpk.ParameterName = "@knownareaPk";
        pmhash.ParameterName = "@mhash";
        sqLiteCommand.Parameters.Add(pcatpk);
        sqLiteCommand.Parameters.Add(pknowncatpk);
        sqLiteCommand.Parameters.Add(pmhash);
        foreach (CatItem CatItem in _knownFiless)
        {

            if (CatItem.FromMasterHashes == true)
            {
                pcatpk.Value = CatItem.areaPk;
                pknowncatpk.Value = CatItem.areaPk;
                pmhash.Value = CatItem.mhash; 
            }
            else
            {
                pcatpk.Value = CatItem.areaPk;
                pknowncatpk.Value = null;
                pmhash.Value = CatItem.mhash; 
            }
            sqLiteCommand.ExecuteNonQuery();
        }
        sqLiteCommand.CommandText = "end";
        sqLiteCommand.ExecuteNonQuery();
        sqLiteCommand.Dispose();
        sqLiteConnection.Close();
    }
    sqLiteConnection.Close();
}

最佳答案

首先要确保你在 mhash 上有索引。 将命令分组。 使用多个线程。

或[插入]

将记录批量导入到临时表中。在 mhash 列上创建索引。执行单个更新语句来更新记录。

关于c# - SqLite C# 更新速度极慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10597823/

相关文章:

c# - ExecuteNonQuery() 抛出 "Incorrect syntax near the keyword ' 用户'”

c# - 使用 DataReader 添加列值

c# - IMemoryCache,驱逐前刷新缓存

c# - 使用 asp.net Identity 进行 Azure AD 身份验证以进行授权

sql - 如何根据位于另一个表中的具有特定属性的列选择 SQLite 表的项目?

c# - 使用 ExecuteNonQuery() 时无法检测到 SQL 错误

c# - ExecuteNonQuery() 不保存任何记录

c# - 在 C# 中创建简单的脚本语言

iphone - 将SQLite客户端数据库与MySQL服务器数据库同步

Android Studio SQLite 游标