Что такое колоночные базы данных и почему они лучше для аналитики
Что проверяют
Знаете ли вы, куда в системе уходит аналитическая нагрузка и почему её не держат в той же базе, что и транзакции. Для бэкендера на Java вопрос про архитектуру хранения: транзакционный контур и витрины живут по разным правилам, и связать их приходится именно вам.
Как отвечать
Суть в раскладке. Строковое хранилище держит поля одной записи рядом, поэтому дёшево прочитать и изменить запись целиком, что и нужно транзакциям. Колоночное держит рядом значения одного поля всех записей, поэтому агрегат по паре полей не трогает остальные.
Три следствия: читается только нужная часть данных, однородная колонка сжимается в разы лучше разнородной строки, движок считает блоками значений одного типа вместо обхода строк.
Дальше опишите типичную схему: PostgreSQL или другая OLTP-база под операции, поток изменений через журнал или брокер, витрина в колоночном хранилище под отчёты и дашборды. Из примеров называйте ClickHouse, Vertica, Greenplum, Redshift, BigQuery; из форматов Parquet и ORC, на которых работают Spark, Flink и табличные форматы поверх объектного хранилища.
Отдельно скажите про запись: колоночные движки принимают данные пачками, буфер на стороне приложения и вставка большими блоками для них не оптимизация, а условие нормальной работы.
Где спотыкаются
Приводят Cassandra как пример колоночной базы для аналитики. Это хранилище с широкими колонками: значения строки внутри партиции лежат вместе, профиль нагрузки точечный. Для сканирования и агрегации оно не про то.
Пишут в витрину из привычного JDBC-кода по одной строке в цикле. Каждая мелкая вставка порождает отдельный кусок данных, движок уходит в непрерывные слияния, и производительность падает на ровном месте. Нужна пачка и контроль частоты.
Ждут от колоночного хранилища транзакций, уникальных ключей и дешёвого точечного UPDATE. Этого там обычно нет: обновление и удаление по одной строке либо дорогое, либо асинхронное, ограничения целостности не проверяются, дедупликацию приходится делать самим на стороне загрузки.