Оптимизация импорта данных в SQL Server 2005 с помощью C # - PullRequest
1 голос
/ 01 января 2009

У меня есть таблица, в которой около 1/2 миллиона записей.

Каждый месяц мы получаем около 1/2 миллиона записей для импорта. В настоящее время они помещаются в другую таблицу в БД, но в конечном итоге будут загружены непосредственно из текстового файла. Для каждой из этих новых записей я должен определить, есть ли у нас эта запись, а если нет, то ее нужно вставить. Однако, если у нас есть запись, она должна быть обновлена. Есть логика, чтобы эти обновления содержали код C #.

Программа командной строки C # обрабатывает импорт этих новых данных, и поэтому сейчас существует 1/2 миллиона операторов выбора - по одному для каждой записи. Затем, группа (снова около 1/2 миллиона) операторов вставки и обновления генерируется и запускается для базы данных.

Это займет около 6 часов для запуска на моей рабочей станции. У вас есть идеи, как это ускорить? Мне нужно выполнить около 60 таких крупных операций импорта, чтобы привести базу данных к текущему месяцу, а затем загружать новые данные один раз в месяц.

Я думаю, что одна область, которая может быть улучшена, это 1/2 миллиона операторов выбора. Возможно, я мог бы выполнить один оператор select, чтобы получить все строки, сохранить их в памяти и найти их. Могу ли я использовать список для этого или есть лучший класс? Мне придется искать по двум свойствам (или полям БД).

Ответы [ 2 ]

2 голосов
/ 01 января 2009

Взгляните на .NET Framework 2.0 SqlBulkCopy class.

MSDN Ссылка .

1 голос
/ 01 января 2009

Да, переместите логику в один сохраненный процесс, который выполнит групповую вставку во временную таблицу (без ведения журнала, а затем обработайте все записи во временной таблице в двух отдельных операторах ... Одно обновление для всех записей которые существуют в таблице desti, и одна вставка для всех тех, кто не

   Update DestTable Set
       ColName = T.ColName,
       [repeat for all cols]
    From TmpTable T Join DestTable D On D.Pk = T.Pk

    Insert DestTable(ColList)
    Select [ColList]
    From TmpTable T
    Where Not Exists (Select * From DestTable
                      Where pk = T.Pk)

Если это создает слишком большие транзакции для вашего журнала транзакций, разбейте его на более мелкие куски

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...