Массовые операции с SQL CE / LINQ - PullRequest
1 голос
/ 20 января 2011

Я пытаюсь написать программу для преобразования большого количества данных из устаревшей системы SQL Express в более новую систему, основанную на SQL CE. Вот краткий снимок происходящего:

  • Большинство таблиц в установке SQL Express маленькие (<10K записей) </li>
  • Одна таблица - чрезвычайно большая - больше 1 миллиона записей

Для небольших таблиц я могу использовать LINQ очень хорошо, но большая таблица доставляет мне проблемы. Стандартный способ:

foreach(var dataRow in ...) 
{ 
    table.InsertOnSubmit(dataRow); 
}

database.SubmitChanges();

Болезненно медленно и занимает несколько часов. Я даже пытался выполнить несколько простых «массовых» операций, чтобы попытаться устранить одну гигантскую вставку в конце цикла, например:

foreach(var dataRow in ...)
{
   if(count == BULK_LIMIT)
   {
      count = 0;
      database.SubmitChanges(); 
   }

   count++;       
   table.InsertOnSubmit(dataRow);
}

// Final submit, to catch the last BULK_LIMIT item block
database.SubmitChanges();

Я пробовал различные объемные размеры, от относительно небольших значений, таких как 1K-5K, до больших размеров до 300K.

В конечном итоге я застрял, и процесс занимает примерно одинаковое количество времени (несколько часов) независимо от объема.

Итак, кто-нибудь знает способ повысить скорость? Типичным решением будет использование SqlBulkCopy, но это не совместимо с SQL CE.

Пара заметок:

  • Да, мне действительно нужны все записи в SQL CE, и да, я настроил соединение так, чтобы база данных максимально работала на 4 ГБ.
  • Да, мне действительно нужны все последние записи 1M +.
  • Все элементы в каждой строке данных являются примитивными и представляют собой смесь строк и временных меток.
  • Размер устаревшей базы данных SQL Express составляет ~ 400 МБ.

Заранее спасибо - вся помощь приветствуется!

- Дан

1 Ответ

1 голос
/ 20 января 2011

Используйте параметризованный оператор INSERT: подготовьте команду, задайте значения параметров в цикле и повторно используйте одну и ту же команду для каждого INSERT.

Удалите все индексы и повторно примените после выполнения всех INSERT.

Обновление : у Криса Тэккэ здесь самое быстрое решение с использованием SqlCeResultset: Массовая вставка в SQLCE

...