Параллельная массовая вставка с SqlBulkCopy и Azure - PullRequest
7 голосов
/ 01 марта 2012

У меня есть приложение Azure в облаке с базой данных SQL Azure.У меня есть рабочая роль, которая должна выполнять анализ + обработку файла (до ~ 30 миллионов строк), поэтому я не могу напрямую использовать BCP или SSIS.

В настоящее время я использую SqlBulkCopy, однако это кажетсяслишком медленно, так как я видел время загрузки до 4-5 минут для строк из 400 тыс.

1004 * Я хочу запускать мои массовые вставки параллельно;однако, читая статьи об импорте данных в параллельном / управляющем поведении блокировки, он говорит, что SqlBulkCopy требует, чтобы таблица не имела кластеризованных индексов, и необходимо указать блокировку таблицы (блокировку BU).Однако таблицы Azure должны иметь кластеризованный индекс ...

Возможно ли параллельно использовать SqlBulkCopy для одной и той же таблицы в SQL Azure?Если нет, есть ли другой API (который я могу использовать в коде) для этого?

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

Я не понимаю, как вы можете работать быстрее, чем с помощью SqlBulkCopy. В нашем проекте мы можем импортировать 250 тыс. Строк примерно за 3 минуты, поэтому ваша скорость кажется правильной.

Я не думаю, что параллельное выполнение поможет, даже если это технически возможно. Мы выполняем только 1 импорт за раз, в противном случае SQL Azure начинает время ожидания наших запросов.

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

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

1 голос
/ 05 марта 2012

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

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

Это техника, которую я использую для нескольких инструментов (Enzo Backup; Enzo Data Copy); Это не простая вещь, но если все сделано правильно, вы можете значительно оптимизировать время загрузки.

...