Быстрая вставка реляционных (нормализованных) таблиц данных в базу данных SQL Server 2008 - PullRequest
2 голосов
/ 09 июня 2010

Я пытаюсь найти лучший и более быстрый способ вставки довольно большого количества данных (~ 50K строк), чем используемый мной Linq. Данные, которые я пытаюсь записать в локальную базу данных, находятся в списке данных ORM, сериализованных и полученных из WCF. Я заинтересован в использовании SqlBulkCopy, но проблема в том, что таблицы нормализованы и на самом деле представляют собой последовательности или взаимосвязанные таблицы с отношениями один-ко-многим.

Вот код, иллюстрирующий мою точку зрения:

foreach (var meeting in meetingsList)
    {
         int meetingId = dbAccess.InsertM(value1, value2...);
         foreach (var competition in meeting.COMPETITIONs)
         {
                int competitionId = dbAccess.InsertC(meetingid, value1, value2...);
                foreach(var competitor in competition.COMPETITORs)
                {
                       int competitorId = dbAccess.InsertCO(comeetitionId, value1,....)
                       // and so on
                }
         }
    }

где dbAccess.InsertMeeting выглядит примерно так:

// check if meeting exists
int  meetingId = GetMeeting(meeting, date);

if (meetingId == 0)
{
   // if meeting doesn't exist insert new
   var m = new MEETING
   {
       NAME = name,
       DATE = date
   }
   _db.InsertOnSubmit(m);
   _db.SubmitChanges();
}

Заранее спасибо за любые ответы. Боян

1 Ответ

4 голосов
/ 09 июня 2010

Я бы по-прежнему использовал SqlBulkCopy для быстрого копирования ваших данных из внешнего файла в промежуточную таблицу , которая имеет такую ​​же (плоскую) структуру, что и файл (вам нужно создать эту таблицу вперед времени)

После загрузки вы можете разделить данные по нескольким таблицам, например, с помощью. хранимая процедура или что-то - должно быть довольно быстро, так как все уже на сервере.

...