Плохая производительность Sqlite.net расширения
Привет, я разрабатываю приложение Xamarin, которое загружает много строк (около 10 КБ).
У меня очень плохая производительность, примерно 2 минуты, чтобы вставить 5K строк объекта.
Я использую InsertOrReplaceWithChildren:
public bool Insert_Update_Many<T>(List<T> obj)
{
try
{
lock (this.Lock) {
_connection.RunInTransaction(() => {
_connection.InsertOrReplaceAllWithChildren(obj, true);
});
}
return true;
}
catch (Exception ex)
{
Debug.WriteLine("[SQLITE_ERROR]: " + ex.ToString());
return false;
}
}
Так как я добавляю "RunInTransaction", я получил улучшение (раньше было 5 минут +).
Мои объекты содержат отношения кораблей.
Есть ли способ оптимизировать это?
3 ответа
Трудно сказать, не видя реального кода, но я столкнулся с несколькими проблемами, которые могут повлиять на производительность:
InsertOrReplace
производительность плохая: попробуйте назвать простойInsert
заявления вместоInsertOrReplace
, В некоторых сценариях это может оказать большое влияние.- SQLite.Net выполняет операции вставки одну за другой: это сложный обходной путь, поскольку он требует, чтобы вы писали запросы вставки вручную, чтобы выполнить более одной вставки для каждого оператора.
- SQLite-Net Extensions выполняет
update
Операции после вставки: это просто обходной путь, вы можете назначить внешние ключи самостоятельно и вызвать обычный SQLite.NetInsert
на базы данных интенсивных операций.
Вы можете улучшить производительность вставки, используя режим WAL:
var journalMode = await globalConn.ExecuteScalarAsync<string>("PRAGMA journal_mode = wal");
Вот предложение:
Попробуйте выполнить необработанные запросы или, фактически, сначала профилировать код, возможно, где-то там есть узкое место.
И если вы ничего не получите, я думаю, вам нужно будет сделать это асинхронно и ждать пользователя (или отправить файл базы данных вместе с вашим приложением)