Сегменты и партиции. В чем различие?
В этой статье мы разберем, в чем разница между сегментом и партицией и для чего они нужны.
Ранее, до перехода на сегменты, в Экстракторе 1С для определения границы инкрементальной выгрузки использовался термин «партиция». Теперь эту роль выполняет понятие «сегмент обновления данных».
Сегмент — блок таблицы данных, полученный путем отбора строк из первоначального набора данных по заданному уникальному значению ключа сегментирования. Сегментирование данных происходит путем логического деления данных на блоки (в отличие от партицирования, где деление таблицы данных происходит физически). Деление на сегменты позволяет удалить соответствующую группу записей и заменить ее на новые, обеспечивая инкрементальность данных.
Партиция — физическая часть таблицы данных, выделенная для удобства хранения и обработки в памяти и состоящая из смежных блоков. Поэтому таблица, которая была разбита на партиции, называется партицированной. Партиционирование поддерживается для СУБД PostgreSQL и Clickhouse (из тех СУБД, что мы поддерживаем).
Как работают сегменты?
Для наглядности создадим проект для выгрузки данных с сегментированием. Выгрузим выручку и себестоимость продаж. Разделим данные по периоду:
Выберем несколько полей, настроим таблицу, как обычно, и на этапе маппинга укажем параметры для сегментирования. Необходимо отметить эти поля флагами (галочками):
В то же время настройки партиций пока оставляем пустыми.
Способ обновления в настройках строки при этом установится в “Обновление сегмента”.
Выполним выгрузку. Таблица выгружается с заданными полями. Чтобы понять, какие строки удаляются для обновления сегмента, используется поиск по индексируемому полю “ПараметрПериод”.
То есть сегмент удаляется, а вместо него добавляется новый. Так работают сегменты.
Как работают партиции?
Теперь разберем, что такое партиции и как они функционируют.
Изменим наш проект. Уберем флаг сегмента у параметра, а вместо сегментирования зададим партицирование на этапе расширенных настроек:
Затем поменяем способ обновления на “Перезапись партиции” в настройках строки проекта.
Что происходит в этом случае?
Таблица физически разделяется на несколько файлов на диске. Например, зайдем в директорию данных ClickHouse для базы данных Default, таблицы VIS_09102024 (“Выручка и себестоимость”, так мы ее назвали) и увидим, что создалось множество папок с файлами.
В каждой из папок хранится отдельная партиция. Если выбран режим обновления с партицированием удаляется вся партиция, выполняется команда drop partition и затем данные записываются заново.
Заключение
Основное отличие: сегмент — это индексируемое поле, а партиция — это физические файлы. Различие также проявляется и в обработке запросов.
При работе с партициями данные хранятся в многочисленных файлах, и при выполнении инструкции select открываются все эти файлы. Однако, файловая система ограничивает количество одновременно читаемых файлов, что может привести к ошибке.
При работе же с индексируемыми таблицами (при сегментировании) открывается один файл, и поиск осуществляется быстрее.