← Назад к вопросам

Почему колоночная модель данных работает быстрее?

2.0 Middle🔥 141 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Колоночная модель данных и её производительность

Колоночная модель (column-oriented) работает быстрее на аналитических запросах благодаря лучшей компрессии, кэшированию и минимизации считываемых данных. Давайте разберёмся, почему.

Строчная vs колоночная модель

Строчная модель (Row-oriented) — традиционные БД:

Таблица users:
| ID | Name  | Age | City     | Salary |
|----|-------|-----|----------|--------|
| 1  | Alice | 28  | Moscow   | 100000 |
| 2  | Bob   | 35  | SPb      | 120000 |
| 3  | Carol | 31  | Moscow   | 110000 |

Физическое расположение в памяти:
[1][Alice][28][Moscow][100000][2][Bob][35][SPb][120000]...

Данные хранятся последовательно по строкам. Для получения одного столбца нужно прочитать все остальные столбцы.

Колоночная модель (Column-oriented) — аналитические БД:

Физическое расположение в памяти:
[1][2][3]... (ID)
[Alice][Bob][Carol]... (Name)
[28][35][31]... (Age)
[Moscow][SPb][Moscow]... (City)
[100000][120000][110000]... (Salary)

Данные хранятся по столбцам. Для запроса нужны только нужные столбцы.

Почему колоночная быстрее

1. Минимизация считываемых данных

Строчная модель:

# Запрос: SELECT AVG(salary) FROM users WHERE city = 'Moscow'
# Нужно прочитать все строки, хотя нужны только Age и Salary
# Считываемый объём: 3 строки × 5 столбцов = 15 значений

Колоночная модель:

# Считать только City и Salary столбцы
# Считываемый объём: 3 значения (City) + 3 значения (Salary) = 6 значений
# Экономия: 60% меньше данных из диска!

2. Лучшая компрессия

Один столбец содержит данные одного типа — их легче сжимать:

# Столбец City: ["Moscow", "SPb", "Moscow", "SPb", "Moscow", ...]
# Много повторов → сжимается хорошо (RLE — Run-Length Encoding)

# Столбец Age: [28, 35, 31, 42, 29, ...]
# Числовые значения в узком диапазоне → эффективная кодировка

# В строчной модели: [1][Alice][28][Moscow]...
# Смешанные типы → плохая компрессия

Пример сжатия:

# Без сжатия: "Moscow" повторяется 1000000 раз = 7MB
# С RLE в колоночной: ("Moscow", count: 1000000) = несколько KB
# Компрессия: в 1000 раз!

3. Лучшее использование CPU кэша

Строчная модель — плохо для кэша:

# SELECT AVG(salary) FROM users (1 миллион строк)
# Нужно загрузить в кэш весь Salary столбец
# Столбец разбросан по памяти, много cache misses

total = 0
for row in rows:  # Читаем по памяти прыгая везде
    total += row.salary

Колоночная модель — отлично для кэша:

# Salary столбец — непрерывный блок в памяти
# CPU кэш загружает большой блок за раз
# Sequential access → много cache hits

Salary = [100000, 120000, 110000, ...]
total = sum(salary_column)  # Очень быстро!

4. Векторизация операций

Колоночная модель — идеальна для SIMD:

# SIMD = Single Instruction Multiple Data
# Обработать несколько значений одной инструкцией

# Salary = [100000, 120000, 110000, 95000, ...]
# CPU инструкция может сложить 4 значения за раз
# В строчной модели это невозможно из-за разрозненности

Примеры реальной производительности

Запрос: SELECT COUNT(*) WHERE salary > 100000

PostgreSQL (строчная):

# Время: 500ms
# Почему: нужно прочитать все данные, отфильтровать в памяти

ClickHouse (колоночная):

# Время: 10ms (в 50 раз быстрее!)
# Почему: прочитал только столбец salary, сжатый в 100 раз

Когда используют колоночную модель

OLAP (Online Analytical Processing):

# Аналитические запросы
# SELECT AVG(amount), region FROM transactions GROUP BY region
# Читаем мало столбцов, много строк

OLTP (Online Transaction Processing):

# Операционные запросы
# SELECT * FROM users WHERE id = 42
# Читаем все столбцы, одну строку
# → строчная модель быстрее

Примеры колоночных БД

ClickHouse:

# Компания Yandex
# Для аналитики, логов, метрик
# Скорость: триллионы строк в секунду

Apache Parquet:

# Формат хранения файлов
# Использует колоночное сжатие
# Идеален для Big Data (Spark, Hadoop)

PostgreSQL + TimescaleDB:

# Расширение для временных рядов
# Комбинирует строчный + колоночный подход

Недостатки колоночной модели

# 1. Вставки медленнее
# Нужно обновлять несколько столбцов

# 2. Загрузка всей строки дороже
# Нужно собирать значения из разных столбцов

# 3. Сложнее индексирование
# Индексы нужны по-другому

Вывод

Колоночная модель в 10-100 раз быстрее на аналитических запросах благодаря:

  • Минимизации дискового ввода-вывода
  • Лучшей компрессии
  • Более эффективному кэшированию CPU
  • Возможности векторизации (SIMD)

Отсюда правило: строчная БД для транзакций (OLTP), колоночная для аналитики (OLAP).