Как подобрать размер сегмента в Экстракторе 1С?

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

Предисловие

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

Большой набор данных нет необходимости каждый раз выгружать целиком. Экстрактор 1С делит его на сегменты, чтобы распределить нагрузку и выполнять первоначальную выгрузку параллельно в несколько потоков. Для больших объёмов это заметно быстрее, чем один запрос ко всему набору сразу. В рамках Экстрактора 1С, сегмент – это порция данных, которая выбирается из 1С по конкретному набору параметров. Например, документы за один день, движения регистра за день или элементы справочника с одинаковыми первыми двумя буквами наименования.

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

Здесь и появляется задача подбора размера: слишком крупный сегмент — это тяжелый запрос к 1С и в последствии большой объем повторной выгрузки, а слишком мелкий создает длинную очередь из множества коротких операций.

Универсального количества строк для сегмента нет, оно зависит от источника и распределения данных.

Для источника данных типа «Объект» Экстрактор 1С автоматически предлагает параметры сегментирования:

  • для справочников – первые две буквы наименования;

  • для документов и регистров – день.

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

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

Теперь подробнее рассмотрим на что обратить внимание при подборе размера сегмента для разных объектов-источников данных.

Источник данных «Объект»

В данном разделе мы рассмотрим разные варианты источников данных «Объект».

Справочники

Для справочника «Первые две буквы» наименования, чаще всего, наиболее удобный вариант разделения на сегменты, однако распределение может оказаться очень неровным. Например, справочник «Контрагенты»: если многие наименования начинаются с «ООО», значительная часть элементов попадет в сегмент «ОО», а индивидуальные предприниматели соберутся в сегмент «ИП». Таким образом, будет сформировано два сегмента, которые могут быть заметно крупнее остальных, хотя сама настройка формально корректна.

Если такой перекос мешает выгрузке, то можно выбрать другой реквизит для сегментирования, например «Ссылка». Сегментирование по ссылке дает точечное обновление: один элемент справочника – один сегмент. Однако, при выборе сегментирования по ссылке рекомендуется использовать настройку «Максимальное количество элементов очереди в одной выгрузке» (данная настройка осуществляется на этапе 11 создания проекта выгрузки).

Сами сегменты остаются ссылками, но вставка нескольких элементов очереди в целевую таблицу объединяется в одну выгрузку. Для первого теста можно взять диапазон 100–1000 элементов и затем подобрать значение по фактическому объему данных. Для небольшого справочника допустима и полная выгрузка, если она занимает приемлемое время. Сегментирование становится особенно полезным, когда справочник большой или часто меняется.

Документы

Для документов Экстрактор 1С предлагает сегментировать выгрузку по параметру «День», в таком случае все документы одной даты попадают в общий сегмент.

Если в Вашем случае один день — это слишком большой сегмент, то можно перейти к сегментированию по ссылке. Таким образом, изменение документа приводит к выгрузке только этого документа и связанных с ним строк, а не данных за весь день. Однако, следует иметь в виду, что у сегмента «Ссылка» есть обратная сторона: при массовых изменениях очередь быстро растет. Если используется сегмент по ссылке, для вставки в СУБД действует та же рекомендация по настройке «Максимальное количество элементов очереди в одной выгрузке», что и для справочников.

Пример настройки проекта для выгрузки документа с регистрацией изменений по ссылке продемонстрирован в статье.

В версиях Экстрактора 1С начиная с 3.8.4.70 для таких случаев есть режим расширения параметров. Например, можно использовать ссылку как обычный сегмент, а день – как расширенный. Пока изменений немного, выгружаются конкретные документы. Когда изменений внутри дня становится слишком много, Экстрактор может перейти к выгрузке дня целиком. При этом сегментом инициализации может быть неделя для быстрой выгрузки первоначального большого объема данных. Для первого проекта этот режим необязателен, но о нем полезно знать.

Примеры настройки проектов с использованием режима расширения параметров продемонстрированы в разделе.

Регистры

Для регистров Экстрактор 1С также предлагает сегментировать выгрузку по параметру «День», но один день в небольшом регистре сведений и один день в крупном бухгалтерском регистре – это совершенно разные объемы. Поэтому рекомендуется, после тестовой выгрузки посмотреть, сколько строк приходится на один день и сколько времени выполняется такой сегмент. Если отдельный день слишком тяжелый:

  1. разделить регистр по еще одному параметру, например по «Организации» или «Складу»;

  2. если у регистра есть Регистратор, то можно настроить сегментирование по «Регистратору». В таком случае, будут выгружаться движения конкретного документа-регистратора.

Пример настройки выгрузки с сегментирование по Регистратору продемонстрирован в статье.

Регистратор, как и ссылка, обычно формирует небольшие сегменты и большое количество элементов очереди. Поэтому здесь также полезно объединять вставку нескольких элементов очереди настройкой «Максимальное количество элементов очереди в одной выгрузке», либо рассмотреть режим расширения параметров.

Виртуальные таблицы

Обороты

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

Остатки

При работе с «Остатками» сначала необходимо определить, на какие даты действительно нужны срезы. Здесь уменьшение периода не означает уменьшение общего объема выгрузки. Если сегмент задан месяцем, то выгружается остаток на конец месяца. Если заменить месяц на день, то остаток будет выгружаться уже на каждый день. Для месяца из 30 дней — это примерно в 30 раз больше срезов, и объем данных обычно возрастает кратно. Поэтому, если месячный срез остатков получается слишком большим, уменьшать период до дня не нужно – это приведет к обратному эффекту. Лучше оставить нужную периодичность среза и разделить сам срез еще по одному параметру, например по «Организации» или «Складу». Также с помощью Экстрактора 1С можно реализовать сценарий, когда в прошлых периодах данных хранятся на конец каждого месяца, а в текущем месяце остатки выгружаются на текущую дату.

ОстаткиИОбороты

Практическая рекомендация: для регулярных выгрузок не следует использовать «ОстаткиИОбороты» как универсальный источник. Для оптимизации лучше отдельно получать обороты и отдельно нужные срезы остатков. Так для каждой части можно подобрать свое сегментирование и точнее управлять нагрузкой на 1С.

Источник данных «Запрос»

Для источника «Запрос» готового универсального сегмента нет. Параметры сегментирования задаются в самом запросе, и один его запуск должен возвращать данные одного конкретного сегмента. Если сегмент – день, параметры запроса ограничивают выборку этим днем. Если сегмент – месяц, запрос получает один месяц. Иначе Экстрактор 1С будет перебирать очередь, а запрос при каждом запуске возвращать лишние данные.

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

Полезно оценивать две вещи одновременно: время выполнения одного сегмента в 1С и объем результата. Если один запуск упирается в память или таймаут, сегмент нужно делить точнее. Если сам запрос тяжелый, а сегментов уже очень много, стоит проверить более крупную гранулярность.

Другие типы источников

Для источников данных «CSV» и «Excel» в Экстракторе 1С сегментирование не используется. Для источника данных «Обработчик» можно основываться на той же логике сегментирования, что и для источника «Запрос»: один вызов должен работать с конкретной порцией данных, определяемой параметрами.

Другие параметры, от которых зависит подбор размера сегмента

СУБД-приемник и способ передачи

Границы сегмента определяются на стороне 1С, но база-приемник все равно влияет на общую производительность. При обновлении сегмента соответствующие данные в целевой таблице нужно удалить или заменить и записать заново. Очень крупный сегмент может быть приемлемым для запроса 1С, но тяжелым для операции в СУБД.

ClickHouse, PostgreSQL и MS SQL по-разному ведут себя на больших операциях записи и удаления, поэтому правила вида «для этой СУБД всегда ставьте день» нет. Если запрос в 1С отрабатывает быстро, а большая часть времени уходит на запись в таблицу-приемник, нужно отдельно смотреть структуру таблицы, индексы, способ подключения и ресурсы сервера.Способ выгрузки данных («Блоками» или «Через файл») тоже относится уже к транспортировке результата. Он влияет на общую скорость, но не задает границы сегмента. Сначала подбирается сегмент внутри 1С, затем при необходимости оптимизируется передача и запись.

Как понять, что сегмент выбран неудачно?

Слишком крупный сегмент обычно заметен по одному из двух признаков:

  • один запрос по сегменту регулярно упирается в память, таймаут или выполняется заметно дольше остальных;

  • весь проект ждет несколько тяжелых сегментов, пока основная очередь уже обработана.

Для документов в такой ситуации можно перейти от сегментирования по дню к сегментированию по ссылке, а для регистров – к сегментированию по регистратору. Также можно рассмотреть дополнительный реквизит для сегментирования. Для виртуальной таблицы «Остатки» логика другая: период до дня не уменьшают, а добавляют дополнительный параметр, например организацию или склад.

Если сегменты «Ссылка» или «Регистратор» дают слишком много мелких изменений, то Вы можете использовать режим расширения параметров (доступный начиная с версии 3.8.4.70 Экстрактора 1С). Регулярный сегмент, в таком случае, остается точечным, а при превышении заданного количества элементов очереди Экстрактор 1С заменяет группу таких сегментов более крупным расширенным сегментом, например, днем.

Слишком мелкий сегмент выглядит иначе:

  • в очереди появляются тысячи элементов;

  • каждый элемент выполняется быстро, но весь проект все равно идет долго;

  • основное время уходит на большое количество коротких операций, а не на получение данных.

Здесь стоит проверить более крупный сегмент или режим расширения параметров. Если используется сегментирование по ссылке или регистратору, воспользуйтесь настройкой «Максимальное количество элементов очереди в одной выгрузке», которая помогает сократить накладные расходы на вставку, хотя сами логические сегменты при этом не меняются.

Вывод

Подытожим краткой шпаргалкой по подбору размера сегмента:

Источник

Базовый вариант

Если сегмент слишком тяжелый

Справочник

Первые 2 буквы наименования

Ссылка или другой реквизит (например, ВидНоменклатуры).

Документ

День

Ссылка или другой реквизит (например, Организация или Склад).

Регистр

День

Регистратор или другой реквизит

Виртуальная таблица «Обороты»

День

Перейти в режим расширения параметров и добавить второй параметр, например, «Организацию» или «Склад».

Виртуальная таблица «Остатки»

Нужная дата среза, часто месяц

Не уменьшать период до дня.

Перейти в режим расширения параметров и добавить второй параметр «Организацию», «Склад» или др.

Запрос или Обработчик

По логике данных

Изменить период, в редких случаях, добавить параметр с учетом самого запроса.

Предлагаем Вам использовать следующий практический порядок проверки для подбора подходящего размера сегмента:

  1. В первом тесте можно оставить сегментирование, которое предложил Экстрактор 1С для объекта, и выполнить проект. Дальше достаточно пройти четыре шага:

    1. посмотреть очередь и найти самые крупные и самые мелкие сегменты;

    2. сравнить время выполнения нескольких сегментов и объем возвращаемых данных;

    3. внести небольшое изменение в 1С и проверить, какой сегмент попал в инкрементальную очередь;

    4. изменять сегментирование только там, где видна конкретная проблема: тяжелый запрос, неравномерная разбивка или слишком длинная очередь.