Столбцовая база данных
Столбцовая база данных (англ. column-oriented DBMS, columnar database) — это система управления базами данных (СУБД), которая физически хранит данные не по строкам (записям), а по столбцам (колонкам). В отличие от традиционных строко-ориентированных СУБД, где все поля одной записи располагаются последовательно на диске, в столбцовых системах значения одного атрибута (столбца) для всех записей таблицы хранятся вместе. Такая организация хранения оптимизирована для аналитических запросов (OLAP), которые обрабатывают большие объёмы данных, но затрагивают лишь небольшое подмножество столбцов.
История
Идея столбцового хранения данных возникла задолго до появления первых коммерческих реализаций. Ещё в 1970-х годах в академических исследованиях обсуждались альтернативные способы организации данных на физическом уровне. Однако практическое применение стало возможным только с развитием вычислительных мощностей и удешевлением оперативной памяти.
Первой коммерчески успешной столбцовой СУБД стала Sybase IQ, выпущенная в 1996 году. Она была ориентирована на хранилища данных и аналитику. В 2000-х годах появились специализированные системы, такие как C-Store (прототип, разработанный в Массачусетском технологическом институте), Vertica (основанная на C-Store), ParAccel, а также MonetDB и Vectorwise (позднее — Actian Vector). В 2010-х годах столбцовые технологии стали внедряться в массовые СУБД: в Microsoft SQL Server (начиная с версии 2012, в виде columnstore-индексов), SAP HANA (гибридная система), Google BigQuery и Amazon Redshift. В России столбцовые СУБД, такие как ClickHouse (разработка компании «Яндекс»), получили широкое распространение для задач веб-аналитики и мониторинга.
Принципы хранения
Строковое vs. столбцовое хранение
В строко-ориентированной СУБД (например, PostgreSQL, MySQL, Oracle) данные на диске организованы так: последовательно записываются все поля первой записи, затем все поля второй и так далее. Для чтения одной строки достаточно одного обращения к диску, но для чтения одного столбца из миллиона строк потребуется прочитать весь блок данных, содержащий ненужные поля.
В столбцовой СУБД значения одного столбца хранятся в непрерывной области на диске. Например, для таблицы «Продажи» (дата, товар, количество, цена) все значения столбца «количество» будут расположены последовательно. Это позволяет при запросе «сумма количеств по всем продажам» прочитать только один столбец, игнорируя остальные.
Сегментация и сжатие
Столбцы обычно разбиваются на блоки фиксированного размера (сегменты, гранулы). Каждый сегмент содержит значения для определённого диапазона строк. Внутри сегмента данные могут быть дополнительно сжаты. Высокая степень сжатия достигается благодаря однородности данных в столбце: если столбец содержит мало уникальных значений (например, «пол» или «категория товара»), применяются алгоритмы словарного кодирования, дельта-кодирования, run-length encoding (RLE) или битовые карты (bitmap). Сжатие не только экономит место на диске, но и ускоряет чтение, так как с диска считывается меньший объём данных.
Индексация
Столбцовые СУБД часто используют зонные карты (zone maps) — метаданные, которые хранят для каждого сегмента минимальное и максимальное значение, а также количество NULL-значений. При выполнении запроса с условием (WHERE) система может быстро отбросить сегменты, заведомо не содержащие подходящих строк, не читая их с диска. Это называется разреженной индексацией (sparse indexing).
Классификация
Столбцовые СУБД можно разделить на несколько категорий по способу хранения и архитектуре:
- Чисто столбцовые (pure columnar): все данные хранятся только в столбцовом формате. Примеры: Vertica, ClickHouse, MonetDB.
- Гибридные (hybrid): поддерживают как строковое, так и столбцовое хранение, часто в рамках одной таблицы. Примеры: SAP HANA, Microsoft SQL Server (columnstore-индексы), Oracle Database (In-Memory Column Store).
- Столбцовые на основе строк (row-columnar): строковые данные могут быть преобразованы в столбцовый формат на уровне отдельных таблиц или партиций. Пример: PostgreSQL с расширением cstore_fdw (сторонняя разработка).
По типу нагрузки:
- OLAP-ориентированные: предназначены для аналитики, агрегаций, отчётов. Составляют большинство столбцовых СУБД.
- HTAP-системы (Hybrid Transactional/Analytical Processing): способны обрабатывать как транзакции (OLTP), так и аналитику. Примеры: SAP HANA, SingleStore (ранее MemSQL), TiDB (с поддержкой TiFlash).
Устройство и характеристики
Архитектура запроса
Столбцовая СУБД обычно включает следующие компоненты:
- Парсер — разбор SQL-запроса.
- Оптимизатор — построение плана выполнения, использующего столбцовое чтение.
- Исполнитель — векторное выполнение (vectorized execution): операции (сумма, фильтрация, группировка) выполняются не над одной строкой, а над целыми векторами значений (например, 1024 значения за раз). Это повышает эффективность использования кэша процессора.
- Хранилище — управление сегментами, сжатием, слиянием данных.
Сжатие и производительность
Степень сжатия в столбцовых СУБД может достигать 10–20 раз по сравнению с исходным несжатым строковым форматом. Например, ClickHouse в тестах демонстрирует сжатие от 5 до 15 раз в зависимости от типа данных. Это позволяет хранить петабайты данных на относительно недорогих дисках.
Скорость чтения
Запросы, агрегирующие данные по одному или нескольким столбцам (SUM, AVG, COUNT, GROUP BY), выполняются в столбцовых СУБД в десятки и сотни раз быстрее, чем в строковых, при условии, что задействовано не более 10–20% столбцов таблицы. Однако запросы, требующие выборки всех столбцов (SELECT *), могут быть медленнее, так как требуют чтения всех столбцовых сегментов и их последующей сборки в строки.
Ограничения
- Операции вставки и обновления (INSERT, UPDATE) в столбцовых СУБД обычно медленнее, чем в строковых, из-за необходимости перестраивать сжатые сегменты. Для решения этой проблемы используется буферизация вставок (вставка в оперативную память с последующим периодическим слиянием в столбцовые блоки).
- Транзакционная изоляция (ACID) реализована не во всех системах. Многие столбцовые СУБД жертвуют строгой изоляцией ради производительности, предлагая модель «read-committed» или «snapshot isolation».
- Сложность поддержки — для эффективной работы требуется тонкая настройка параметров сжатия, партиционирования и сортировки данных.
Применение
Столбцовые базы данных используются в следующих областях:
- Хранилища данных (data warehouses) — централизованные репозитории для бизнес-аналитики, отчётности, дашбордов.
- Аналитика больших данных (big data) — обработка логов событий, веб-аналитика, мониторинг систем (например, ClickHouse используется в Яндекс.Метрике).
- Научные вычисления — обработка результатов экспериментов, геномные данные, временные ряды.
- Финансовый сектор — анализ транзакций, расчёт рисков, fraud-детекция.
- Интернет вещей (IoT) — сбор и агрегация показаний датчиков.
Примеры
- ClickHouse (Россия) — колоночная СУБД с открытым исходным кодом, разработанная компанией «Яндекс». Поддерживает SQL-подобный язык запросов, высокую степень сжатия, репликацию и шардирование. Используется для аналитики в реальном времени.
- Vertica (США, сейчас принадлежит Micro Focus) — коммерческая столбцовая СУБД, основанная на проекте C-Store. Поддерживает массово-параллельную обработку (MPP) и автоматическое сжатие.
- Amazon Redshift — облачная столбцовая СУБД от Amazon Web Services. Основана на модифицированной версии ParAccel. Поддерживает интеграцию с S3, Spectrum и другими сервисами AWS.
- Google BigQuery — бессерверная облачная аналитическая СУБД, использующая столбцовое хранение (формат Capacitor). Поддерживает SQL-запросы и потоковую вставку.
- SAP HANA — гибридная in-memory СУБД, поддерживающая как строковое, так и столбцовое хранение. Позволяет выполнять аналитические запросы в оперативной памяти.
- MonetDB — академическая столбцовая СУБД с открытым исходным кодом, ориентированная на аналитику и научные вычисления.
Критика
Основные претензии к столбцовым СУБД касаются их ограниченной пригодности для транзакционных нагрузок (OLTP). Вставка одиночных записей с последующим немедленным чтением (типичная задача для веб-приложений) в столбцовых системах выполняется медленно. Кроме того, сложность реализации полноценной поддержки ACID (особенно изоляции и долговременных блокировок) в столбцовых архитектурах выше, чем в строковых.
Некоторые исследователи отмечают, что для смешанных нагрузок (HTAP) гибридные системы (SAP HANA, SingleStore) часто оказываются компромиссным решением, не достигающим пиковой производительности ни в одном из режимов. Также существует проблема «проклятия размерности»: при очень большом количестве столбцов (сотни и тысячи) столбцовое хранение может терять преимущество из-за накладных расходов на чтение метаданных и сборку строк.
Источники
- Abadi, D., Boncz, P., Harizopoulos, S., Idreos, S., & Madden, S. (2013). The Design and Implementation of Modern Column-Oriented Database Systems. Foundations and Trends in Databases.
- Stonebraker, M., et al. (2005). C-Store: A Column-oriented DBMS. Proceedings of VLDB.
- Документация ClickHouse. (2024). Яндекс.
- Документация Vertica. (2024). Micro Focus.
- Документация Amazon Redshift. (2024). Amazon Web Services.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →