MS SQL Server - массовая вставка через сеть

У меня есть приложение, которое использует MS SQL Server, для которого мне нужно сделать массовую вставку из файла. Камнем преткновения является то, что база данных и мое приложение будут размещаться на отдельных серверах. Каков наилучший способ сделать массовую вставку по сети? До сих пор я придумал две идеи:

  1. На сервере приложений предоставьте общий доступ к каталогу, который может найти сервер БД, и выполните импорт, используя оператор массовой вставки из удаленного файла.

  2. Запустите FTP-сервер с сервера db - когда импорт будет выполнен, просто загрузите файл ftp на сервер db и выполните импорт, используя массовую вставку из локального файла (я склоняюсь к этой опции).

Может кто-нибудь еще сказать мне, есть ли лучший способ сделать это, или если нет, какой из них имеет больше смысла, и почему?

5 ответов

Я делал это раньше и пробовал оба варианта.

В конце я сделал противоположный выбор 1. Предоставить общий доступ к каталогу на сервере БД, который может найти приложение. Вам не нужно иметь дело с проблемами пропускной способности во время массовой вставки.

Опция FTP-сервера работает, если вы особенно обеспокоены безопасностью или переносимостью.

Последний вариант (будьте очень осторожны) - использовать DTS с локализованным SQL-сервером. Это может быть более безопасно. Если вы сделаете это неправильно, это будет гораздо менее эффективно.

Я все еще ищу способ сделать это в MS SQL, но в MySQL я сохранил CSV как BLOB во временной таблице, запустил SELECT ... INTO DUMPFILE в каталоге, локальном для сервера БД, затем выполните обычную инструкцию LOAD DATA для этого локального файла (EDIT: я чувствую, что должен указать, это было до того, как LOAD DATA LOCAL была доступна).

Я думаю, что spWriteStringToFile сделает это.

РЕДАКТИРОВАТЬ: я на что-то.

comm.CommandText = @"EXEC spWriteStringToFile @data, 'c:\datadumps', 'data.csv';
    BULK INSERT my_table FROM 'c:\datadumps\data.csv';";
comm.Parameters.AddWithValue("data", File.ReadAllText(path));
comm.ExecuteNonQuery();

На самом деле вы можете разместить файл на сервере приложений и базы данных.

Оба файла должны иметь одинаковый путь. С сервера приложений цель только для выбора. Сервер базы данных предназначен для массовой вставки.

Это то, что я сделал для своего клиента, и они также согласились с этим простым трюком.

Если файл достаточно мал, то опция ftp может работать (у вас будет дубликат в вашем поле базы данных). Однако я не вижу особой проблемы в варианте 1), если у вас есть гигабитная сеть между ними с одним прыжком.

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

Я не согласен с cmartin по поводу добавления открытого ресурса на сервер БД. Как правило, вы не хотите открывать файловые ресурсы на сервере db, поскольку это обычно считается угрозой безопасности, и многие места этого не допустят. Тем не менее, это сведет на нет необходимость переноса файла в другое место для использования массового импорта.

Другие вопросы по тегам