Любые предложения по оптимизации экспорта BCP с сервера SQL с использованием подпроцесса Python - PullRequest
0 голосов
/ 05 февраля 2020

Я изучаю BCP для экспорта большого количества данных (один раз для первоначального и планирую сделать это в повседневной работе).

Исходные данные находятся в SQL серверных таблицах, которые состоят из нескольких маленьких таблиц в большие (10M + строк) Пункт назначения находится на другом компьютере (экспорт в файлы).

В настоящее время я реализую его с помощью подпроцесса python.

С помощью команды BCP без указания размера пакета (queryout, -U, -P, -S, -c). И запрос очень прост (SELECT <column_names> FROM <table_name>). Может быть, добавление WHERE дат в повседневной работе.

Я пробовал с данными 100k, это заняло около 2 минут. Однако я не пробовал с данными 10M + из-за ограничений моей компании на использование производственных данных в среде разработки. Кроме того, я не смог вставить какие-либо данные в исходный сервер SQL (только для чтения).

Кто-нибудь может подсказать, есть ли способы оптимизировать процесс экспорта BCP?

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

Большое вам спасибо.

1 Ответ

1 голос
/ 05 февраля 2020

Если вы перемещаете данные с одного SQL сервера на другой сервер MS SQL, то использование опции -N для копирования данных в ваши файлы в собственном формате поможет сократить время на преобразование типов данных в текст.

Использование параметра -a для указания размера сетевого пакета. Я не могу предложить здесь правильное значение, так как это будет зависеть от вашей сети (идет ли файл на диск, который распространяется с сервера? Если так, то попробуйте здесь другие значения ... если нет, не беспокойтесь ... не участвует в сети).

Используйте параметр -b при импорте данных в пункт назначения. Я не могу предложить здесь правильное значение, так как оно будет зависеть от архитектуры вашей системы, но поиграйтесь с этим значением в тестировании, чтобы получить уточненное значение. Это не работает с экспортом.

При экспорте большой таблицы выведите копию в несколько файлов. Надеемся, что у ваших больших таблиц есть цифра c или какое-либо число чисел c, которое имеет высокую селективность. Это значение можно использовать для разделения ваших данных на 10 или 100 потоков. Это позволит вам одновременно выполнять несколько команд bcp, используя одну и ту же таблицу. Используйте опцию «queryout» и команду типа:

«select * from db.dbo.mytable, где ключ% 10 = 0», чтобы получить 1/10 данных и:

» выберите * из db.dbo.mytable, где ключ% 10 = 1 ", чтобы получить следующую или другую 1/10 часть данных.

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

...