2016-04-21 4 views
2

Привет Я разрабатываю приложение Xamarin, что нагрузить много линий (около 10К)Низкая производительность расширения Sqlite.net

я получил очень плохой производительности что-то вроде 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 ресурсоемких операций с базами данных.
+0

Я думаю, что правильно, мне нужно написать свою логику для моего сценария. –

0

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

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

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

+0

я сделал, и проблема заключается во вставке ... Когда я использую ни один SQLITE метода расширений это действительно быстро, но я потерял преимущество расширений. отправка базы данных с помощью приложения не является опцией, так как данные устанавливаются в бэк-офисе и меняются много раз –

3

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

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

Это улучшает немного, но не значительно :( –

Смежные вопросы