Способы выгрузки данных

В «Экстрактор 1С» есть 3 способа выгрузки данных: «Блоками», «Через файл». В данной статье на примере СУБД MS SQL рассмотрен принцип работы этих способов и их особенности.

Примечание

выгрузка «Через файл» будет работать быстрее, однако для ее использования необходимо будет настроить каталоги обмена.

Способ выгрузки «Блоками»

Этот способ использует стандартный метод загрузки данных через инструкцию INSERT. То есть данные каждой партиции вставляются в таблицу методом INSERT. При этом, старые данные партиции удаляются методом DELETE.
Строки инструкций SQL имеют ограниченную длину, зависящую от множества параметров, поэтому инструкций может быть больше , чем одна для каждой партиции.
Схематично это можно изобразить так:

При использовании данного способа стоит помнить, что к выполнению получается очень много инструкций. Каждая инструкция, в свою очередь, это запрос на вставку строк. При этом MS SQL при выполнении запроса:

  • обновляет индексы в таблице, что приводит к трате ресурсов сервера;

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

  • регистрирует каждую инструкцию INSERT в журнале транзакций (протоколирование).

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

Способ выгрузки «Через файл»

Способ выгрузки «Через файл» рекомендуется использовать для выгрузки очень больших таблиц данных.

Этот способ выгрузки использует инструкцию BULK INSERT и берет данные из файла на диске, где 1 файл — 1 инструкция. Кроме того, как заявлено специалистами Microsoft, при использовании BULK INSERT требуется меньше протоколирования, благодаря чему все работает быстрее. Накладные расходы на транзакции в случае с BULK INSERT снижаются за счет того, что команда обрабатывается как отдельная транзакция, в отличие от нескольких транзакций в отдельных вставках INSERT, как при способе выгрузки «Блоками».

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

Таким образом, Каталог загрузки (должен быть доступен для чтения серверу MS SQL) и Каталог выгрузки (должен быть доступен серверу 1С для записи) — это пути к одному каталогу обмена.

Важно!

Для работы данного способа выгрузки данных необходимо настроить доступ и Сервера 1С, и Сервера MS SQL к этой папке(этим обычно занимается системный администратор), а также у пользователя SQL-сервера должны быть права bulkadmin.

--добавим нашему пользователю SQL-сервера роль "bulkadmin" чтобы он мог выполнять инструкции bulk insert ALTER SERVER ROLE [bulkadmin] ADD MEMBER [Username]

Алгоритм работы способа выгрузки «Через файл»: сервер 1С помещает данные в виде файлов в каталог обмена (поэтому нужны права записи серверу 1С) и и дает команду серверу MS SQL их загрузить, после чего сервер MS SQL загружает их (для этого нужны только права на чтение серверу MS SQL).
Схематично это можно изобразить так: