Лучшие практики для вставки/обновления большого объема данных в SQL Server 2008

Я создаю систему для обновления больших объемов данных посредством различной подачи CSV. Обычно я просто циклично выполнился бы, хотя каждая строка в канале, сделайте запрос Select, чтобы проверить, существует ли объект уже, и вставьте/обновите объект, зависящий, если это существует или нет.

Я чувствую, что этот метод не очень масштабируем и мог ковать сервер на большей подаче. Мое решение состоит в том, чтобы циклично выполниться через объекты как нормальные, но сохранить их в памяти. Затем для каждых приблизительно 100 объектов делают выбор на тех 100 объектах и получают список существующих объектов в базе данных то соответствие. Затем свяжите вставить/обновить операторы вместе и выполните их в базу данных. Это по существу сократило бы прохождения в базу данных.

Действительно ли это - достаточно масштабируемое решение и является там какими-либо учебными руководствами в качестве примера при импорте большой подачи в продуктивную среду?

Спасибо

13
задан marc_s 14 December 2015 в 09:55
поделиться

5 ответов

Видя, что вы используете SQL Server 2008, я бы порекомендовал такой подход:

  • сначала скопируйте файлы CSV в промежуточную таблицу
  • обновление ваша целевая таблица из этой промежуточной таблицы с помощью команды MERGE

Ознакомьтесь с документами MSDN и отличным сообщением в блоге о том, как использовать команду MERGE.

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

  • строки совпадают, например строка существует как в исходной, так и в целевой таблице -> обычно вы либо обновляете некоторые поля, либо просто игнорируете все вместе
  • строка из источника не существует в целевой -> обычно случай для INSERT

у вас будет оператор MERGE примерно такого типа:

MERGE TargetTable AS t
USING SourceTable AS src
ON t.PrimaryKey = src.PrimaryKey

WHEN NOT MATCHED THEN
  INSERT (list OF fields)
  VALUES (list OF values)

WHEN MATCHED THEN
  UPDATE
    SET (list OF SET statements)
;

Конечно, предложение ON может быть гораздо более сложным, если это необходимо. И, конечно же, ваши операторы WHEN также могут быть более сложными, например

WHEN MATCHED AND (some other condition) THEN ......

и так далее.

MERGE - очень мощная и очень полезная новая команда в SQL Server 2008 - используйте ее, если можете!

14
ответ дан 1 December 2019 в 23:14
поделиться

Если вы используете генератор PDF или XPS, он по-прежнему требует, чтобы вы определили состав документа так же, как и создание сценария HTML, поэтому я не вижу, что он дает вам гораздо больше значений, кроме созданного файла в готовом формате.

Вам нужно что-то, что вы можете разработать шаблон и просто заполнить пустую, поэтому я предлагаю вам либо перейти к автоматизации Word или Excel, иначе посмотрите на какую-то облегченную библиотеку генерации отчетов. Я сталкиваюсь с этим, и, возможно, это тоже стоит проверить. http://www.fyireporting.com/

-121--2964685-

Можно ли запускать код Java и Python в одном и том же приложении?

Каждая версия приложения должна указывать язык выполнения, и можно использовать версию x приложения на Java, в то время как версия y работает на Python. Также можно было бы использовать Jython.

Источник: Часто задаваемые вопросы о приложении Google App Engine для Java

-121--3866160-

Вам вообще нужно здесь работать? Можно ли предоставить данные таким образом, чтобы SQL Server мог использовать массовый импорт для загрузки их в и последующей обработки дубликатов в базе данных после завершения импорта?

Когда дело доходит до тяжелого подъема с большим количеством данных, мой опыт, как правило, заключается в том, что работа в базе данных максимально быстро и менее ресурсоемко.

0
ответ дан 1 December 2019 в 23:14
поделиться

Одним из способов является загрузка CSV в DataTable (или, более вероятно, DataReader), а затем пакетный слэм в результатах с помощью SqlBulkCopy -

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

Это довольно эффективно, и вы можете выполнить некоторые сопоставления столбцов. Наконечник - при сопоставлении столбцов с помощью SqlBulkCopy они чувствительны к регистру.

2
ответ дан 1 December 2019 в 23:14
поделиться

Ваш способ - худшее из возможных решений. Вообще, не стоит думать в терминах перебора записей по отдельности. У нас в компании был встроенный инструмент импорта, который циклически просматривал записи, на загрузку файла с более чем миллионом записей уходило 18-20 часов (что не было частым явлением, когда он был создан, но сейчас происходит много раз в день).

Я вижу два варианта: Сначала использовать массовую вставку для загрузки в промежуточную таблицу и выполнить все необходимые действия по очистке этой таблицы. Как вы определяете, существует ли уже запись? Вы должны быть в состоянии создать обновление на основе набора, присоединившись к промежуточной таблице по тем полям, которые определяют обновление. Часто я добавляю столбец в свою таблицу для id записи, с которой она совпадает, заполняю его с помощью запроса, а затем выполняю обновление. Затем выполняется вставка записей, у которых нет соответствующего идентификатора. Если у вас слишком много записей, чтобы сделать все сразу, вы можете запустить пакетную обработку (что да, является циклом), но делайте партии значительно больше, чем 1 запись за раз (я обычно начинаю с 2000, а затем на основе времени, которое требуется для этого, определяю, могу ли я сделать больше или меньше в партии).

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

Альтернативой является использование SSIS, который оптимизирован для скорости. Однако SSIS - сложная штука, и кривая обучения очень крутая.

3
ответ дан 1 December 2019 в 23:14
поделиться

Другим подходом может быть написание хранимой процедуры .Net на сервере для работы со всем файлом...

Только если вам нужно больше контроля, чем в решении Криса Краузе, хотя - я большой поклонник сохранения простоты (и многократного использования) там, где это возможно...

0
ответ дан 1 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: