繁体   English   中英

C#SQLite删除行真的很慢

[英]C# SQLite deleting rows really slow

我创建了一个脚本来删除本地sqlite数据库中的大约180行。 这是我的代码:

await Task.Run(() =>
{
    sql_con.Open();

    using (var trans = sql_con.BeginTransaction())
    {
        foreach (int i in toDelete)
        {
            cmd = String.Format("DELETE FROM document WHERE docid = '{0}'", i);
            sql_cmd = new SQLiteCommand(cmd, sql_con);
            sql_cmd.ExecuteNonQuery();
        }
        trans.Commit();
    }

    sql_con.Close();
}).ConfigureAwait(false);

我用秒表和Debug.WriteLine对其进行了测试...它大约需要2-12秒的时间。 但这只需要几毫秒的时间。 docid列被标记为索引列,并且在数据库中不超过500行左右。

如果我使用相同的脚本来插入内容,则大约需要几毫秒的时间。

有任何想法吗?

编辑1:这是我的PRAGMA的

PRAGMA AUTO_VACUUM=0;
PRAGMA synchronous=OFF;
PRAGMA COUNT_CHANGES=OFF;
PRAGMA TEMP_STORE=MEMORY;

编辑2:这是我的数据库脚本:

CREATE TABLE IF NOT EXISTS document (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  docid TEXT NOT NULL,
  key TEXT NOT NULL,
  value TEXT,
  UNIQUE (docid, key)
);

CREATE INDEX IF NOT EXISTS docid_index ON document (docid);

编辑3:这是我最新的脚本,其中包含所有更改:

await Task.Run(() =>
{
    Stopwatch stopwatch = Stopwatch.StartNew();
    sql_con.Open();
    Debug.WriteLine("After open {0} seconds.", stopwatch.Elapsed.TotalSeconds);
    stopwatch.Restart();

    using (var trans = sql_con.BeginTransaction())
    {
        sql_cmd = sql_con.CreateCommand();
        sql_cmd.Transaction = trans;
        sql_cmd.CommandText = "DELETE FROM document WHERE docid = '@docid';";

        foreach (int i in toDelete)
        {
            sql_cmd.Parameters.AddWithValue("@docid", i);
            sql_cmd.ExecuteNonQuery();
        }

        Debug.WriteLine("After execute nonQuery {0} seconds.", stopwatch.Elapsed.TotalSeconds);
        stopwatch.Restart();
        trans.Commit();
        Debug.WriteLine("After commit {0} seconds.", stopwatch.Elapsed.TotalSeconds);
        stopwatch.Restart();
    }

    sql_con.Close();
    Debug.WriteLine("After close {0} seconds.", stopwatch.Elapsed.TotalSeconds);
    stopwatch.Stop();

}).ConfigureAwait(false);

尝试一起发送所有内容

await Task.Run(() =>
{
    sql_con.Open();

    using (var trans = sql_con.BeginTransaction())
    {
        foreach (int i in toDelete)
        {
            cmd += String.Format("DELETE FROM document WHERE docid = '{0}';\n", i);             
        }
        sql_cmd = new SQLiteCommand(cmd, sql_con);
        sql_cmd.ExecuteNonQuery();
        trans.Commit();
    }

    sql_con.Close();
}).ConfigureAwait(false);

有趣的是,当我在另一个程序中测试整个脚本时,只需几毫秒即可删除约500.000行。 因此,框架中可能存在一个奇怪的错误……但是,我最初在保存新行之后删除了行,如果在保存新行之前删除了行,则可以正常工作。

因此,如果有人遇到类似问题,请尝试先删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM