Плохая производительность 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.Net Insert на базы данных интенсивных операций.

Вы можете улучшить производительность вставки, используя режим WAL:

 var journalMode = await globalConn.ExecuteScalarAsync<string>("PRAGMA journal_mode = wal");

Вот предложение:

Попробуйте выполнить необработанные запросы или, фактически, сначала профилировать код, возможно, где-то там есть узкое место.

И если вы ничего не получите, я думаю, вам нужно будет сделать это асинхронно и ждать пользователя (или отправить файл базы данных вместе с вашим приложением)

Другие вопросы по тегам