Обновления данных традиционно считаются слабым местом колоночных баз данных. Аналитические системы, оптимизированные для высокоскоростного чтения и агрегации, зачастую жертвовали эффективностью изменений в пользу максимальной скорости обработки запросов. ClickHouse долгое время следовал этому тренду, поддерживая мутации и операции обновления посредством тяжелых пересозданий столбцовых частей. Однако недавние нововведения изменили представление о том, насколько быстро и просто могут выполняться UPDATE-запросы в колоночной базе. В центре изменений оказывается механизм patch parts – инновационный подход, позволяющий реализовать привычные SQL-операции обновления с минимальными издержками и высокой скоростью, сохраняя преимущества колоночных архитектур.
Основным вызовом для реализации обновлений в пространстве колоночных баз была их несовместимость с высокопроизводительным режимом вставок и сжатием. Ранние версии ClickHouse решали задачу обновления данных с помощью механизма мутаций. ALTER TABLE ...
UPDATE сопровождался полной переписью измененных столбцов в новых частях данных. Это подходило для небольших объёмов обновлений, но при масштабных изменениях выливалось в неоправданно долгие фоновые операции и задержку видимости изменений для запросов. Далее в эволюции механизма обновления ClickHouse были внедрены «легковесные» удаления — методика, при которой удаление строк сводилось к обновлению специальной служебной колонки _row_exists, что значительно снижало нагрузку на диск, поскольку переписывалась только одна колонка, а остальные жестко связывались с исходными файлами. Это позволило быстрее помечать строки как удалённые, не дожидаясь полного физического стирания при следующем слиянии. Следующим этапом стало появление on-the-fly мутаций, которые изменяли механику видимости данных.
Вместо ожидания завершения фоновой мутации, обновление сразу фиксировалось в памяти и применялось при чтении данных, обеспечивая мгновенную видимость изменений независимо от фонового процесса переписи. Этот шаг улучшил взаимодействие с пользователем и наладил быстрое обновление, однако проблема высокой стоимости фоновых операций осталась нерешённой. Революционное решение было найдено в концепции patch parts. Вместо переписывания обширных колонок целиком, механизм представил патчи — дельты, фиксирующие только строки и столбцы с измененными данными, а не всю основу. Благодаря этому обновления стали легкими, компактными и быстро применимыми.
Patch parts интегрируются в фоновые слияния данных, уже выполняемые ClickHouse, минимально увеличивая нагрузку и прекрасно масштабируясь при больших объёмах и частоте обновлений. Технически patch parts используют внутренние системные колонки для точной навигации и объединения данных при слияниях. _part_offset определяет позицию строки в исходной части, что позволяет эффективно соотносить изменения без затратного индексирования. Дополнительные колонки _block_number и _block_offset помогают отслеживать и корректно применять обновления несмотря на фоновое объединение частей, обеспечивая консистентность и целостность данных. Patch parts создаются автоматически при выполнении стандартных SQL UPDATE-запросов, например, когда требуется изменить цену или количество товаров по условию.
Значения затронутых колонок записываются в отдельном маленьком патче вместе с минимальным набором метаданных, и сразу же становятся видимыми для запросов. Таким образом, пользователю доступен привычный интерфейс SQL с ожидаемым поведением, а система под капотом обеспечивает максимальную производительность и надежность. Кроме производительности, важным достоинством patch parts является их способность координировать параллельные обновления. ClickHouse по умолчанию позволяет одновременно запускать несколько UPDATE-запросов и самостоятельно контролирует их порядок выполнения при наличии зависимостей, исключая конфликты и обеспечивая последовательность данных без дополнительного вмешательства пользователя. Механизм patch parts оказывает влияние и на DELETE-операции, позволяя реализовать еще более легковесные удаления.
Вместо мутаций, DELETE теперь превращается в создание патча, который помечает строки как удалённые с помощью флага _row_exists, который учитывается при чтении. Строки окончательно удаляются при последующих фоновых слияниях, что обеспечивает баланс между быстротой отклика и физической очисткой данных. Patch-on-read, концепция применения патчей во время выполнения запросов, позволяет не блокировать чтение, когда обновления еще не слиты с исходными частями. Обновления трактуются как отдельные логические слои, которые накладываются на исходные данные, что обеспечивает консистентность, высокую скорость и сохранение параллелизма в обработке. Со временем патчи продолжают сливаться друг с другом и с основными частями по алгоритму ReplacingMergeTree, который гарантирует актуальность данных и чистоту хранения.
Механизм реализован таким образом, что патчи разбиваются по отдельным партициям на основании наборов обновляемых колонок, что снижает вероятность превышения лимита TOO_MANY_PARTS и повышает управляемость. Вклад patch parts в экосистему ClickHouse трудно переоценить. Они переводят операции обновления из области тяжелых фоновых процедур в быстродействующие, интерактивные SQL-команды, что соответствует ожиданиям различных пользователей и сценариев: от редких точечных корректировок до массовых обновлений с аналитическими задачами. Это открывает новые возможности для применения ClickHouse в real-time аналитике и задачах, где данные быстро меняются. ClickHouse продолжает развивать этот функционал, а в будущих версиях планы включают расширение возможностей и повышение устойчивости механизма patch parts, включая оптимизацию алгоритмов слияния и уменьшение требований к оперативной памяти при работе с большими патчами.
Таким образом, новая система SQL-style UPDATEs в ClickHouse является примером того, как инновации в ядре СУБД способны радикально улучшить пользовательский опыт и привести к прорыву в производительности. Ранее считавшийся патентованным ограничением колоночных баз данных недостаток — медленные обновления — теперь трансформируется в сильную сторону благодаря форсированным разработкам. Для разработчиков, аналитиков и администраторов ClickHouse обновлённый механизм обновления означает удобство привычного синтаксиса SQL без компромиссов в скорости и надёжности. В будущем это сделает ClickHouse ещё более привлекательной платформой для систем бизнес-аналитики, машинного обучения и мониторинга, где важна каждая секунда реакции. Подводя итог, можно констатировать, что внедрение patch parts в ClickHouse меняет правила игры, объединяя силы быстрого вставления, интеллектуальных слияний и эффективного индексирования для создания адаптивного и высокопроизводительного механизма обновления данных.
Появление таких технологий задаёт новый вектор развития для аналитических баз данных и свидетельствует о том, что падение производительности при обновлении данных в колоночных СУБД более не является неизбежной данностью.