Вам определенно нужна транзакция. Если вы этого не сделаете, SQLite запускает собственную транзакцию для каждой команды вставки, поэтому вы эффективно выполняете 86000 транзакций как есть.
Похоже, вы также каждый раз открываете и закрываете соединение, а также каждый раз сбрасываете CommandText. Это не нужно и, несомненно, замедляет вас, оно будет намного быстрее, если вы:
- Открыть соединение один раз
- Создайте команду один раз, добавив к ней параметры один раз.
- Начать транзакцию
- Цикл, изменение значений параметров только перед вызовом ExecuteNonQuery
- Совершить транзакцию.
- Закрыть соединение.
Думаю, вы могли бы сократить свои 20 минут до нескольких секунд.
Редактировать: вот что я имею в виду:
public void InsertItems()
{
SQLiteConnection connection = new SQLiteConnection(SomeConnectionString);
SQLiteCommand command = connection.CreateCommand();
SQLiteTransaction transaction = connection.BeginTransaction();
command.CommandText = "INSERT OR IGNORE INTO Result "
+ "(RunTag, TopicId, DocumentNumber, Rank, Score) " +
"VALUES (@RunTag, @TopicId, @DocumentNumber, @Rank, @Score)";
command.Parameters.AddWithValue("@RunTag", "");
command.Parameters.AddWithValue("@TopicId", "");
command.Parameters.AddWithValue("@DocumentNumber", "");
command.Parameters.AddWithValue("@Rank", "");
command.Parameters.AddWithValue("@Score", "");
foreach ( /* item to loop through and add to db */ )
{
InsertResultItem(runTag, topicId, documentNumber, rank, score, command);
}
transaction.Commit();
command.Dispose();
connection.Dispose();
}
public int InsertResultItem(string runTag, int topicId, string documentNumber, int rank, double score, SQLiteCommand command)
{
command.Parameters["@RunTag"].Value = runTag;
command.Parameters["@TopicId"].Value = topicId;
command.Parameters["@DocumentNumber"].Value = documentNumber;
command.Parameters["@Rank"].Value = rank;
command.Parameters["@Score"].Value = score;
return command.ExecuteNonQuery();
}
Используется только одно соединение, одна транзакция и одна команда, поэтому все, что вы изменяете, это значения параметров каждый раз.