Путь записи

Для удовлетворения разнообразных требований к рабочим нагрузкам YMatrix поддерживает три режима записи. Активный режим определяется параметрами уровня таблицы prefer_load_mode и rowstore_size. Режимом по умолчанию является Normal.

Image

Режим Single

В режиме Single данные накапливаются в локальной памяти до достижения максимального размера 1 МБ, после чего напрямую вставляются в хранилище строк (rowstore). Этот процесс аналогичен традиционной вставке в кучу (Heap) PostgreSQL. Данные находятся непосредственно в Shared Buffers, размер которых контролируется параметром shared_buffers. В режиме Single рекомендуется увеличить этот параметр, чтобы избежать свопа памяти.

Image

Преимущества:

  • Минимальная задержка вставки.
  • Минимальное потребление памяти.

Недостатки:

  • При больших объемах загрузки данные сначала попадают в rowstore, что требует выполнения дополнительной операции слияния в дальнейшем.
  • Если данные в rowstore не будут своевременно преобразованы в columnstore, отображаемый размер таблицы (\dt+) может быть завышен. Для решения этой проблемы перед проверкой можно вручную выполнить команды VACUUM или VACUUM FULL.
  • Запросы аналитической обработки (AP) и запросы с использованием BRIN-индексов работают менее эффективно по сравнению с columnstore.
  • Отсутствие сжатия приводит к тому, что размеры данных и журнала транзакций (XLOG) в несколько раз превышают размеры в columnstore. Данный режим не подходит для сред с низкой производительностью ввода-вывода.

Режим Bulk

В режиме Bulk данные копируются в локальную память до достижения лимита rowstore_size. Как только этот порог достигнут, данные немедленно преобразуются в формат columnstore и сбрасываются на диск. По завершении операции вставки любые оставшиеся данные в локальной памяти (даже если их объем меньше rowstore_size) также преобразуются в columnstore и сбрасываются на диск.

Преимущества:

  • Данные сжимаются, что снижает нагрузку на дисковый ввод-вывод.
  • Запросы AP и запросы с использованием BRIN-индексов работают эффективнее, чем в rowstore.
  • Исключается один этап усиления записи (write amplification).

Недостатки:

  • Более высокое потребление памяти, часто в несколько раз превышающее потребление rowstore, особенно для таблиц с большим количеством секций.
  • Задержка вставки выше по сравнению с rowstore.

Режим Normal

Режим Normal представляет собой интеллектуальную стратегию вставки. Данные копируются в локальную память.

  • Если использование памяти достигает значения rowstore_size, данные немедленно преобразуются в columnstore и сбрасываются на диск.
  • По завершении операции вставки:
    • Если объем оставшихся данных в локальной памяти меньше rowstore_size / 2, они записываются в текущий rowstore.
    • В противном случае они преобразуются в columnstore и сбрасываются на диск.

Это режим по умолчанию.

Сравнение производительности записи по режимам

  1. Вставка отдельных строк: pgbench -n -f single_insert.sql -c 1 -j 1 -t 100000 test
Тип теста Транзакций на клиент Клиентов Потоков Средняя задержка (мс) TPS (с учетом подключения) TPS (без учета подключения)
single_insert.sql 100,000 1 1 1.98 505.03 505.06
bulk_insert.sql 100,000 1 1 15.282 65.44 65.44
normal_insert.sql 100,000 1 1 1.968 508.02 508.05
  1. Вставка небольшими пакетами: time for i in {1..2000}; do psql test -f batch_insert.sql; done
Режим Общая длительность Всего секунд (с) Строк в секунду (строк/с)
single 2м27с 147 ≈ 680
normal 2м28с 148 ≈ 676
bulk 4м55с 295 ≈ 339
  1. Загрузка большими пакетами: Был создан CSV-файл объемом 50 миллионов строк и импортирован с помощью команды COPY в таблицы, настроенные на разные режимы.
Режим Строк Длительность (секунды)
bulk 50,000,000 69.287
single 50,000,000 50.868
normal 50,000,000 70.612
  1. Сравнение режима Single MARS3 и записи в Heap: Коэффициенты сжатия приближаются к 10:1. TPS примерно на 25% ниже по сравнению со стандартными таблицами Heap.
Имя таблицы Коэффициент сжатия Экономия места
fi_voucher 7:1 86%
fi_voucher_b 15:1 93%
aai_voucher 4.5:1 78%
aai_voucher_record 8.9:1 89%

Сравнение генерации WAL по режимам

В реальном сценарии при вставке одинаковых объемов данных скорость генерации WAL остается постоянной во всех режимах. Однако общий объем сгенерированного WAL составляет примерно 1/3 от объема, создаваемого стандартными таблицами Heap. Это значительно сокращает дисковое пространство, занимаемое файлами WAL.

Image

Вернуться к предыдущему разделу: Принципы движка хранения