C # SQLite Bulk параметризован DELETE медленно даже при использовании транзакции? - PullRequest
0 голосов
/ 17 ноября 2018

Следующий код тратит ~ 2 минуты на удаление 30 тыс. Записей, которые, я уверен, слишком длинные.Большинство подобных вопросов, которые я видел здесь, были решены с помощью объекта SQLiteTransaction, но я уже делаю это.

private void removeProxiesButton_Click(object sender, EventArgs e)
{
    using (var conn = new SQLiteConnection(Properties.Settings.Default.dbConnectionString))
    {
        conn.Open();

        using (var trans = conn.BeginTransaction())
        {
            using (var cmd = new SQLiteCommand("DELETE FROM Proxy WHERE IP=@ip AND Port=@port", conn, trans))
            {
                foreach (DataGridViewRow row in proxiesDataGridView.SelectedRows)
                {
                    var proxy = proxies[row.Index];
                    cmd.Parameters.AddWithValue("@ip", proxy.IP);
                    cmd.Parameters.AddWithValue("@port", proxy.Port);
                    cmd.ExecuteNonQuery();
                    proxies.Remove(proxy);
                }
            }

            trans.Commit();
        }
    }
}

А вот оператор CREATE для Proxyстол.

CREATE TABLE "Proxy" 
(
     `ProxyID` INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, 
     `Status` TEXT, 
     `IP` TEXT, 
     `Port` INTEGER, 
     `Country` TEXT, 
     `Speed` INTEGER, 
     `DateAdded` TEXT 
)

1 Ответ

0 голосов
/ 17 ноября 2018

Создание одного длинного оператора SQLite с помощью StringBuilder и выполнение только объекта SQLiteCommand только один раз значительно ускорило процесс.

private void removeProxiesButton_Click(object sender, EventArgs e)
{
    using (var conn = new SQLiteConnection(Properties.Settings.Default.dbConnectionString))
    {
        conn.Open();
        var sb = new StringBuilder();
        sb.Append("DELETE FROM Proxy WHERE ProxyID IN (");

        foreach (DataGridViewRow row in proxiesDataGridView.SelectedRows)
        {
            var proxy = proxies[row.Index];
            sb.Append(proxy.ProxyID + ",");
        }
        sb[sb.Length - 1] = ')';
        using (var cmd = new SQLiteCommand(sb.ToString(), conn))
        {
            cmd.ExecuteNonQuery();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...