Я считаю, что я использовал много способов ускорить UPDATE из многих строк, Но пока ничего не помогло.SQLite обновление многих строк очень медленно
Мы открываем сделку, так:
private SQLiteTransaction BeginTransaction(SQLiteConnection connection)
{
return connection.BeginTransaction();
}
и закрыть его в конце курса. Открываем одно соединение, одну транзакцию, а затем обновляем многие строки в базе данных. Это означает, что мы собираем множество различных операторов SQL в течение нескольких таблиц.
Одна большая часть является обновление 12000 записей в одной таблице
protected override void UpdateRows(SQLiteConnection connection, IEnumerable<DataRow> rowsToUpdate)
{
var command = new SQLiteCommand(Queries.SQLUpdateDocument, connection);
foreach (DataRow documentRow in rowsToUpdate)
{
command.Parameters.AddWithValue("@Filename", documentRow[Constants.Col_Document_Filename]);
command.Parameters.AddWithValue("@ClassID", documentRow[Constants.Col_Document_ClassID]);
command.Parameters.AddWithValue("@PageCount", documentRow[Constants.Col_Document_PageCount]);
command.Parameters.AddWithValue("@DocID", documentRow[Constants.Col_Document_GlobalDocID]);
command.Parameters.AddWithValue("@ReadOnly", documentRow[Constants.Col_Document_ReadOnly]);
command.Parameters.AddWithValue("@Confirmed", documentRow[Constants.Col_Document_Confirmed]);
command.Parameters.AddWithValue("@ParentFolderID", documentRow[Constants.Col_Document_ParentFolderID]);
command.Parameters.AddWithValue("@SequenceNumber", documentRow[Constants.Col_Document_SequenceNumber]);
command.Parameters.AddWithValue("@XmlRepr", documentRow[Constants.Col_Document_XmlRepr]);
command.ExecuteNonQuery();
documentRow.AcceptChanges();
}
}
с неоспоримым запроса:
UPDATE T_Doc SET
Filename = @Filename,
ClassID = @ClassID,
PageCount = @PageCount,
ReadOnly = @ReadOnly,
Confirmed = @Confirmed,
ParentFolderID = @ParentFolderID,
SequenceNumber = @SequenceNumber,
XmlRepr = @XmlRepr
WHERE ID = @DocID;
в AcceptChanges() не займет много времени. ExecuteNonQuery() намного медленнее, чем ожидалось.
PRAGMA foreign_keys = ON;
было выполнено до того, как команда обновления и ссылки на ClassID и ParentFolderID ссылаются на другие таблицы.
Anyways - обновление происходит очень медленно, обновление 12000 записей занимает 15-30 минут.
Может ли кто-нибудь помочь мне в этом?
Является ли ваш стол индексированным по полю ID? Если вы можете показать, как вы организуете таблицу, это может помочь понять источник проблемы. – athabaska
попробуйте использовать транзакционную модель: open transaction-> execute ** all ** comands-> commit transaction. – Tigran
@athabaska ID - это первичный ключ. SQLite автоматически создаст первичный ключ. – HankTheTank