2011-01-20 2 views
1

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

  • Большинство таблиц в SQL Express установить небольшие (< 10K записей)
  • Одна таблица --extremely-- большой и составляет более 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 МБ.

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

- Dan

+0

~ 400 мегабайт = приблизительно 400MB? –

+0

Да, это так. –

ответ

1

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

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

Update: Крис Таке имеет самое быстрое решение здесь используя SqlCeResultSet: Bulk Insert In SQLCE

+0

Спасибо! это отлично работает. Вниз от 40 минут до 4! – debracey

+1

У меня есть библиотека для SQL Compact Bulk Inserts здесь: http://sqlcebulkcopy.codeplex.com (с использованием SqlCeResultSet) – ErikEJ