Вставка занимает слишком много времени, требуется оптимизация кода - PullRequest
0 голосов
/ 23 января 2010

У меня есть код, который я использую для передачи значений table1 в другие table2, они находятся в другой базе данных.

Медленно, когда у меня 100.000 записей. Это займет вечность, 10+ минут.

(смартфон Windows Mobile)

Что я могу сделать?

cmd.CommandText = "insert into " + TableName + " select * from sync2." + TableName+"";  
cmd.ExecuteNonQuery();

РЕДАКТИРОВАТЬ

Проблема не решена. Я все еще после ответов.

Ответы [ 7 ]

4 голосов
/ 21 февраля 2010

1] Вы можете установить следующие параметры в вашей connectionString

string connectionString = @"Data Source=E:\myDB.db3; New=true; Version=3; PRAGMA cache_size=20000; PRAGMA page_size=32768; PRAGMA synchronous=off";

, который имеет свои ограничения. проверьте эту ссылку для деталей

Вышеуказанное в конечном итоге увеличит размер кэша (cache_size & page_size), но вы можете потерять некоторые данные в случае принудительного отключения вашей системы (синхронно = выключено).

2] Вы можете заключить свои операторы вставки в транзакцию следующим образом

dbTransaction = dbConnection.BeginTransaction();
dbCommand.Transaction = dbTransaction;
// your individual insert statements here
dbTransaction.Commit();

3] Есть еще один трюк, который хорошо объяснен в на этой странице . Проверьте это

Надеюсь, это поможет
Ура!

1 голос
/ 23 января 2010

Насколько я могу судить, вы используете два оператора SQL в строке - один для его вставки, а затем другой для обновления всей таблицы. Вам нужно обновить всю таблицу или только строки, которые вы вставляете? Если нет, вы могли бы просто вставить строку с dirty, установленным на 0 на первом месте.

Вы также можете попытаться изменить свой оператор вставки ad-hoc в подготовленный / скомпилированный / параметризованный оператор. В некоторых базах данных это обеспечивает небольшой прирост скорости.

Есть несколько вариантов улучшения, перечисленных в FAQ по SQLite, здесь .

Наконец, вы выяснили, какое у вас узкое место? Я не очень разбираюсь в производительности приложений для мобильных телефонов. Показывает ли ваш профилирование, что вы привязаны к процессору или к диску?

0 голосов
/ 04 января 2011
  1. Требуется ли для оператора SQL также 10 минут +, если вы делаете это непосредственно в SQL Management Studio?
  2. Если нет, то пытались ли вы сделать это с помощью процедуры SQL и выполнить ее?
  3. Вы пытались настроить пул соединений и / или сделать курсор на стороне сервера?
  4. запустить профилировщик SQL (вы можете вызвать его из студии управления), если 1. работает медленно и добавить очередь транзакций.
0 голосов
/ 23 января 2010

Ну, вы используете процессор запросов для каждой вставки. Будет намного лучше использовать команду, добавить к ней параметры, подготовить ее, а затем просто установить параметры в цикле.

Я не знаю, поддерживает ли SQLite TableDirect команды. Если это произойдет, это будет намного, намного быстрее (например, в SQL Compact на несколько порядков быстрее). Это, безусловно, стоило бы попробовать.

0 голосов
/ 23 января 2010

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

В качестве альтернативы вы могли бы сделать все это как одно утверждение, которое, вероятно, было бы более эффективным, примерно то, что я имею в виду:

http://forums.mysql.com/read.php?61,15029,15029

Надеюсь, это поможет.

0 голосов
/ 23 января 2010

Одно из предложений, которое может помочь (хотя вам нужно будет это профилировать), заключается в том, чтобы вызывать команду вставки или замены один раз для нескольких записей с несколькими значениями. Это будет пакетировать вызовы в БД, что потенциально ускорит процесс.

Кроме того, похоже, что вы копируете из одной БД в другую - если записи не будут существовать в новой БД, вы можете использовать INSERT вместо INSERT OR REPLACE, что (по крайней мере теоретически) быстрее.

Однако ни один из них не будет драматичным - вероятно, это будет медленная операция.

0 голосов
/ 23 января 2010

Я думаю, вы могли бы использовать DataTable (я думаю - или это было DataSet? Извините, все еще новичок в .NET), затем .Fill() результаты Reader в эти DataTable и затем есть операция BulkCopy или BulkInsert, которая может вытолкнуть все это в таблицу в другой базе данных (соединение).

...