Столбцовое хранение данных
Столбцовое хранение данных (англ. columnar storage, column-oriented storage) — это способ организации и хранения данных в базах данных и файловых системах, при котором значения одного столбца (атрибута) таблицы хранятся физически последовательно, отдельно от значений других столбцов. В отличие от строчного хранения (row-oriented storage), где все поля одной записи (строки) располагаются вместе, столбцовый подход группирует данные по колонкам, что обеспечивает существенные преимущества для аналитических нагрузок и операций чтения большого объёма однотипных данных.
История
Идея столбцового хранения восходит к 1970-м годам, когда в рамках исследований систем управления базами данных (СУБД) рассматривались альтернативы традиционным строчным моделям. Первые коммерческие реализации появились в 1990-х годах в системах, ориентированных на аналитическую обработку (OLAP), например в C-Store (предшественник Vertica). Значительный импульс развитию придало распространение «больших данных» (Big Data) и необходимость быстрого выполнения сложных запросов над терабайтными и петабайтными массивами. В 2010-х годах столбцовое хранение стало стандартом де-факто для большинства современных аналитических СУБД, включая Apache Parquet, Apache ORC, Amazon Redshift, Google BigQuery, ClickHouse, а также для движков хранения в гибридных системах (например, InnoDB в MySQL с поддержкой columnar-индексов).
Принцип работы
При столбцовом хранении данные таблицы физически разбиваются на отдельные файлы или блоки, каждый из которых содержит значения только одного столбца. Например, для таблицы «Продажи» с колонками «Дата», «Товар», «Количество», «Цена» создаются четыре отдельных набора данных: все даты подряд, все товары подряд, все количества, все цены. При этом порядок строк сохраняется с помощью позиционных идентификаторов (row IDs), позволяющих при необходимости восстановить исходную запись.
Отличие от строчного хранения
В строчных СУБД (например, PostgreSQL, MySQL, Oracle) каждая строка хранится как единый блок данных. Это оптимально для транзакционных нагрузок (OLTP), где требуется быстрое чтение или изменение одной записи целиком. При столбцовом хранении, напротив, чтение одной колонки не требует загрузки остальных, что резко сокращает объём ввода-вывода при аналитических запросах, оперирующих лишь несколькими атрибутами из многих.
Классификация
Столбцовое хранение реализуется в двух основных формах:
- Нативные столбцовые СУБД — системы, изначально спроектированные для столбцового формата (ClickHouse, Vertica, MonetDB, Amazon Redshift, Google BigQuery). Они не поддерживают строчное хранение или используют его только для служебных целей.
- Гибридные (гибридно-столбцовые) системы — базы данных, способные хранить данные как в строчном, так и в столбцовом формате, выбирая оптимальный режим в зависимости от типа запроса (например, SAP HANA, MySQL с плагином ColumnStore, Microsoft SQL Server с columnstore-индексами).
Также различают чистое столбцовое хранение (каждый столбец — отдельный файл) и пакетное (пакетно-столбцовое) — когда данные группируются в блоки (row groups), внутри которых применяется столбцовое сжатие (Apache Parquet, Apache ORC).
Преимущества и недостатки
Преимущества
- Высокая скорость аналитических запросов: чтение только необходимых столбцов минимизирует объём данных, считываемых с диска. Для запроса «сумма продаж по месяцам» достаточно прочитать две колонки («Дата» и «Сумма») вместо всей таблицы.
- Эффективное сжатие: значения одного столбца часто имеют одинаковый тип данных и повторяющиеся значения (например, коды городов, категории товаров). Это позволяет применять специализированные алгоритмы сжатия (run-length encoding, dictionary encoding, дельта-кодирование), достигая коэффициента сжатия 5–10 раз и выше по сравнению со строчным хранением.
- Автоматическая оптимизация: многие столбцовые СУБД используют статистики по столбцам (минимальное, максимальное значение, количество уникальных значений) для отсечения блоков данных, не участвующих в запросе (predicate pushdown, min-max pruning).
- Поддержка векторной обработки: данные, хранящиеся в столбцовом формате, удобно обрабатывать SIMD-инструкциями (Single Instruction, Multiple Data), что ускоряет вычисления на современных процессорах.
Недостатки
- Низкая производительность для транзакционных операций: вставка, обновление или удаление одной строки требует записи во все столбцы таблицы, что приводит к большому числу операций ввода-вывода. Это делает столбцовые СУБД малопригодными для OLTP-нагрузок.
- Сложность реализации точечных обновлений: из-за физической разобщённости столбцов изменение одного поля в строке может потребовать перезаписи нескольких блоков данных.
- Повышенное потребление памяти при вставках: для поддержки высокой скорости записи часто используются буферные структуры (например, в ClickHouse — MergeTree), что увеличивает оперативную память.
- Ограниченная поддержка JOIN-операций: в некоторых столбцовых системах соединение таблиц может быть менее эффективным, чем в строчных, из-за необходимости перестраивать строки из колонок.
Применение
Столбцовое хранение является основой для большинства современных систем аналитической обработки данных (OLAP), хранилищ данных (Data Warehouse), озёр данных (Data Lake) и систем бизнес-аналитики (BI). Основные области применения:
- Финансовый анализ: расчёт агрегатов (суммы, средние, медианы) по многомиллионным таблицам транзакций.
- Логи и телеметрия: хранение и быстрый поиск событий, метрик, логов работы серверов и приложений (например, в системах мониторинга Prometheus, использующих столбцовый движок).
- Научные и инженерные расчёты: обработка данных с датчиков, результатов экспериментов, геномных последовательностей.
- Рекламные и маркетинговые системы: анализ поведения пользователей, сегментация аудитории, построение отчётов по кликам и конверсиям.
- Хранение больших объёмов данных в озёрах данных: форматы Apache Parquet и Apache ORC стали стандартом для хранения данных в экосистемах Hadoop, Spark, Presto, Amazon Athena.
Примеры систем, использующих столбцовое хранение
- ClickHouse — российская столбцовая СУБД с открытым исходным кодом, разработанная компанией Яндекс. Ориентирована на высокую скорость выполнения аналитических запросов в реальном времени.
- Apache Parquet — открытый формат столбцового хранения, широко используемый в экосистеме Hadoop и Spark. Поддерживает вложенные структуры данных и эффективное сжатие.
- Apache ORC — формат столбцового хранения, оптимизированный для Apache Hive и Apache Spark. Отличается высокой степенью сжатия и поддержкой сложных типов данных.
- Amazon Redshift — облачная аналитическая СУБД от Amazon Web Services, использующая столбцовое хранение и распределённую архитектуру.
- Google BigQuery — бессерверная аналитическая база данных от Google, автоматически хранящая данные в столбцовом формате с использованием собственного движка Colossus.
- Vertica — коммерческая столбцовая СУБД, разработанная на основе проекта C-Store. Применяется для крупномасштабных хранилищ данных.
- SAP HANA — гибридная in-memory СУБД, поддерживающая как строчное, так и столбцовое хранение, выбираемое автоматически в зависимости от типа таблицы.
- Microsoft SQL Server — начиная с версии 2012 года поддерживает columnstore-индексы, позволяющие создавать столбцовые представления для таблиц.
- MariaDB ColumnStore — столбцовый движок для MariaDB, ориентированный на аналитические нагрузки.
Интересные факты
- Столбцовое хранение позволяет достичь коэффициента сжатия данных до 10–20 раз по сравнению с исходным размером, что существенно экономит дисковое пространство и ускоряет передачу данных по сети.
- В системах, использующих столбцовое хранение, часто применяется техника «векторизации» — обработка данных не по одной строке, а блоками (например, по 1024 строки), что позволяет эффективно загружать кэш процессора.
- Формат Apache Parquet, разработанный компаниями Twitter и Cloudera, стал одним из самых популярных форматов для хранения данных в озёрах данных благодаря поддержке сложных вложенных структур и совместимости с большинством современных инструментов обработки данных.
- Некоторые СУБД, например, DuckDB, используют столбцовое хранение не только для аналитических запросов, но и для выполнения SQL-запросов над файлами Parquet без загрузки данных в память целиком.
Источники
- Abadi, D. J., Boncz, P. A., Harizopoulos, S. (2009). «Column-oriented Database Systems». VLDB Journal.
- Stonebraker, M. et al. (2005). «C-Store: A Column-oriented DBMS». Proceedings of VLDB.
- Документация ClickHouse: «Столбцовое хранение данных».
- Документация Apache Parquet: «Parquet Format Specification».
- Документация Amazon Redshift: «Columnar Storage and Compression».
- Документация Google BigQuery: «Storage and Query Processing».
- Документация Microsoft SQL Server: «Columnstore Indexes».
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →