Я пытаюсь написать программу для преобразования большого количества данных из устаревшей системы 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 МБ.
Заранее спасибо - вся помощь приветствуется!
- Дан