Начало работы
Подключение
Тесты производительности
Развёртывание
Использование данных
Загрузка данных
Миграция данных
Запрос данных
Управление кластерами
Обновление
Глобальное обслуживание
Масштабирование
Мониторинг
Безопасность
Лучшие практики
Технические принципы
Типы данных
Хранилище
Исполняющий движок
Потоковая обработка (Domino)
MARS3 Индексы
Расширения
Расширенные функции
Расширенный запрос
Федеративные запросы
Grafana
Резервное копирование и восстановление
Аварийное восстановление
Графовая база данных
Введение
Предложения
Функции
Расширенные темы
Руководство
Настройка производительности
Устранение неполадок
Инструменты
Параметры конфигурации
SQL-команда
Часто задаваемые вопросы
Режим Unique — это специализированная модель записи в MARS3, предназначенная для преобразования операций «обновление записи» в «вставку новой записи с тем же уникальным ключом». Движок хранения автоматически обрабатывает замену старых версий новыми версиями для одного и того же значения ключа.
Основная ценность этого режима заключается в возможности выражать семантику обновления с помощью более простого и унифицированного пути записи (INSERT) в сценариях с высокой частотой записи. Это снижает накладные расходы и сложность явных операторов UPDATE, сохраняя при этом лучший контроль над организацией данных при непрерывной записи.
Области применения:
DELETE (или может выражать недействительность/истечение срока действия другими средствами).В режиме Unique уникальный ключ определяется ключом сортировки таблицы (ORDER BY (...)). Когда вставляется новая запись с Unique Key, совпадающим с существующей записью, движок трактует это как обновление данного ключа. Явный оператор UPDATE не требуется; прямая команда INSERT реализует семантику обновления.
В отличие от традиционного UPSERT (INSERT ... ON CONFLICT), режим Unique выполняет слияние во время чтения.
COMPACT.Следовательно, эффективность записи в режиме Unique значительно выше, чем у традиционного UPSERT. Бенчмарки показывают, что производительность режима Unique примерно в 1,5 раза выше, чем у традиционного UPSERT.
В сценариях режима Unique,涉及ющих перезапись одного и того же ключа:
new_jsonb = jsonb_concat(old_jsonb, incoming_jsonb). База данных внутренне вызывает jsonb_concat для выполнения слияния.Примеры:
postgres=# SELECT jsonb_concat('[1,2]'::jsonb, '[2,3]'::jsonb);
jsonb_concat
--------------
[1, 2, 2, 3]
(1 строка)
postgres=# SELECT jsonb_concat('{"k":1,"x":2}'::jsonb, '{"k":null}'::jsonb);
jsonb_concat
---------------------
{"k": null, "x": 2}
(1 строка)
postgres=# SELECT jsonb_concat('{"a":1,"b":2}'::jsonb, '{"b":99,"c":3}'::jsonb);
jsonb_concat
---------------------------
{"a": 1, "b": 99, "c": 3}
(1 строка)
Это позволяет приложениям, использующим JSONB для динамических атрибутов, расширяемых полей или тегов, записывать только инкрементальные изменения. Движок берет на себя слияние, избегая сложности и конфликтов параллелизма, связанных с чтением старых значений, их слиянием на уровне приложения и обратной записью.
event_id и обеспечьте уникальность на уровне приложения или используйте структуру объекта/карты для перезаписи по ключу.null (например, {"k": null}) обновляет значение до null; это не удаляет ключ.Зачем нужна UpdateChain? Для обеспечения корректности при параллельных обновлениях одной и той же строки.
В стандартных таблицах Heap PostgreSQL обновление не является изменением на месте. Вместо этого старый кортеж помечается как удаленный, и вставляется новый кортеж. Поле ctid связывает старую версию с новой, формируя цепочку обновлений (update chain).

В MARS3 маркеры удаления/обновления не хранятся в заголовке кортежа (как xmax в Heap). Вместо этого они записываются в Delta-файлы. Чтобы гарантировать сохранение этой информации после уплотнения (compaction) или сброса, используются Link-файлы.
ctid (указатели версий встроены в сами данные).Ранние версии MARS3 выдавали ошибку при параллельных обновлениях одной и той же строки из-за отсутствия поддержки UpdateChain. С внедрением UpdateChain MARS3 теперь использует TupleLock для блокировки логических строк и проходит по цепочке обновлений для поиска последней версии. Это обеспечивает последовательное выполнение параллельных обновлений, гарантируя корректную семантику UPDATE.
Подобно PostgreSQL, YMatrix реализует обновления и удаления через управление многоверсионным параллелизмом (MVCC), а не путем изменения данных на месте:
DELETE записывает факт удаления в Delta-файл соответствующего Run. Физическое удаление данных происходит только при слиянии Run.UPDATE фактически удаляет исходные данные и вставляет новую запись.Мертвые кортежи (невидимые runs), образовавшиеся в результате обновлений и удалений, очищаются фоновым процессом autovacuum. Также можно выполнить ручной VACUUM. Кроме того, в процессе COMPACT, когда меньшие Run объединяются в большие, невидимые Run удаляются.
VACUUM FULL идет дальше, объединяя несколько небольших Run в один большой. Если новых записей не поступает, выполнение VACUUM FULL будет агрессивно сливать пакеты до тех пор, пока дальнейшее слияние станет невозможным. В конечном итоге размер каждого оставшегося пакета будет приближаться к настроенному значению max_runsize. Обратите внимание, что сам процесс VACUUM FULL может генерировать некоторые невидимые Run в ходе выполнения.
Резюме:
VACUUM: Сбрасывает данные, удаляет невидимые Run и записывает данные rowstore вниз.VACUUM FULL: Выполняет все действия VACUUM плюс агрессивное слияние Run.Вернуться к предыдущему разделу: Принципы движка хранения