簡體   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