Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SqLite C#更新速度极慢_C#_Sqlite_Executenonquery_Journal - Fatal编程技术网

SqLite C#更新速度极慢

SqLite C#更新速度极慢,c#,sqlite,executenonquery,journal,C#,Sqlite,Executenonquery,Journal,我真的在努力解决这个问题。当我使用以下代码更新数据库中的大量记录时,它的运行速度非常慢。我有500000条记录要更新,这几乎需要一个小时。在此操作期间,日志文件增长缓慢,主SQLite db3文件几乎没有变化-这正常吗 只有当我有大量的数据或记录需要更新时,这个操作才似乎是一个问题——它几乎可以在少量的记录上立即运行 在运行此代码之前,还对数据库执行了一些其他操作,因此这些操作可能是如何占用数据库的?我已尝试确保所有其他连接都已正确关闭 谢谢你的建议 using (SQLiteConnectio

我真的在努力解决这个问题。当我使用以下代码更新数据库中的大量记录时,它的运行速度非常慢。我有500000条记录要更新,这几乎需要一个小时。在此操作期间,日志文件增长缓慢,主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();
}

这部分肯定是你的问题

foreach (CatItem CatItem in _knownFiless)
{
....
     sqLiteCommand.ExecuteNonQuery();
}

您正在循环列表(?)并对数据库执行查询。这不是一个好办法。因为数据库调用非常昂贵。因此,您可以考虑使用另一种方法来更新这些项。

第一个确保在MHASH上有索引的方法。 将命令分组为批。 使用多个线程

或[插入]


将记录大容量导入到临时表中。在mhash列上创建索引。执行一条update语句来更新记录。

SQL代码似乎正常。C#代码没有错,但它有一些冗余(不需要显式关闭/处置,因为您已经在使用
了)

在_knownFiless(用于双s?)上有一个for循环,它可能运行得很慢吗?在针对DB的for循环中运行查询是不常见的,而应该使用相应的参数集创建查询。考虑到(特别是在哈希上没有索引),你将执行N*M操作(n是for循环的运行计数,m是表大小)。 考虑到m约为500k,并假设m=n,您将获得25000000000次操作。这很可能会持续一个小时

据我所知,以前的连接或操作应该没有任何影响


您还应该确保数据库的内部结构不会引起问题。是否存在受此操作影响的复合索引?是否有外键/复杂约束?

您需要将所有内容封装在事务中,否则我相信SQLite会为您创建并提交一个用于每次更新的外键/复杂约束。。。因此是缓慢的。您清楚地知道,查看您的代码,但我不确定在这里使用“Begin”和“End”命令是否能获得相同的结果,您可能会在开始和结束时得到空事务,而不是一个包装所有内容的事务。请尝试这样做,以防万一:

  using (SQLiteTransaction mytransaction = myconnection.BeginTransaction())
  {
    using (SQLiteCommand mycommand = new SQLiteCommand(myconnection))
    {
      SQLiteParameter myparam = new SQLiteParameter();

      mycommand.CommandText = "YOUR QUERY HERE";
      mycommand.Parameters.Add(myparam);

      foreach (CatItem CatItem in _knownFiless)
      {
        ...
        mycommand.ExecuteNonQuery();
      }
    }
    mytransaction.Commit();
  } 

mhash
列上是否有索引?“CatItem CatItem”与您的命名不一致。而是使用“var catItem”。它只是提高了可读性(局部变量的大小写)正是我的问题,问题是缺少mhash的索引。我以为我有一个,但仔细检查后的建议,发现我没有!我已经添加了一个索引,我的表现已经达到了顶点!非常感谢大家的建议-这让我发疯了!