Для чего используются колоночные базы данных?

«Для чего используются колоночные базы данных?» — вопрос из категории Базы данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Колоночные базы данных (columnar stores) оптимизированы для сценариев OLAP (Online Analytical Processing) — сложной аналитической обработки больших объемов данных, в отличие от OLTP (Online Transaction Processing) систем, оптимизированных для множества коротких транзакций.

Ключевое преимущество: скорость выполнения агрегирующих запросов (SUM, AVG, COUNT, GROUP BY) над подмножеством столбцов по миллиардам строк.

Как это работает и почему это быстро:

  1. Хранение по столбцам: Все значения одного столбца хранятся вместе, а не строки целиком. Это позволяет:
  2. Эффективное сжатие: Данные в одном столбце однотипны (например, только INT или DATE), что позволяет применять мощные алгоритмы сжатия (например, run-length encoding, dictionary compression).
  3. Сканирование только нужных столбцов: Для запроса SELECT AVG(salary) FROM employees система читает с диска только блоки колонки salary, пропуская name, email, address.
  4. Векторизованное выполнение: Операции выполняются над целыми массивами (векторами) значений из столбца, что максимально эффективно для CPU.

Типичные use-cases:

  • Бизнес-аналитика (BI) и дашборды.
  • Анализ логов и телеметрии.
  • Хранение и запросы к большим фактологическим таблицам в хранилищах данных (Data Warehouse).

Пример на ClickHouse:

-- Создание таблицы с движком MergeTree (колоночный)
CREATE TABLE user_events (
    event_date Date,
    event_time DateTime,
    user_id UInt32,
    event_type String,
    duration_sec UInt32,
    country_code FixedString(2)
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_date)
ORDER BY (event_date, user_id);

-- Быстрый аналитический запрос, обрабатывающий миллиарды строк
SELECT 
    toStartOfHour(event_time) AS hour,
    country_code,
    count() AS events_count,
    avg(duration_sec) AS avg_duration
FROM user_events
WHERE event_date >= today() - 7
    AND event_type = 'page_view'
GROUP BY hour, country_code
ORDER BY hour, events_count DESC;

Популярные колоночные СУБД: ClickHouse, Amazon Redshift, Google BigQuery, Vertica. Форматы колоночного хранения: Apache Parquet, Apache ORC — используются в Hadoop/Spark экосистеме.

Недостаток: Запись данных (INSERT/UPDATE) обычно медленнее, чем в строчных базах, так как требует перезаписи целых столбцов. Поэтому они идеальны для append-only или пакетной загрузки данных.