Я пытаюсь написать программу для преобразования большого количества данных из старой системы 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
~ 400 мегабайт = приблизительно 400MB? –
Да, это так. –