[英]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.