Что такое векторизованное выполнение (Vectorized Execution)?

Векторизованное выполнение — это техника выполнения запросов, при которой обрабатывается несколько значений одновременно (в пакетах или векторах), а не построчно. Это значительно улучшает производительность за счет использования современных архитектур процессоров и снижения числа пропусков в кэше процессора.

Как работает векторизованное выполнение?

Традиционные базы данных обрабатывают одну строку за раз (построчное выполнение). Векторизованное выполнение обрабатывает целые столбцы или блоки данных одновременно с использованием операций SIMD (Single Instruction, Multiple Data — Одна инструкция, несколько данных). Поскольку современные процессоры поддерживают инструкции SIMD, векторизованное выполнение может применить одну операцию (например, сложение или фильтрацию) к нескольким значениям одновременно.

Сравнение: традиционное построчное выполнение против векторизованного выполнения

ХарактеристикаПострочное выполнение (Традиционные OLAP)Векторизованное выполнение (ClickHouse, Vertica, DuckDB, Snowflake)
Подход к обработкеОбрабатывает одну строку за разОбрабатывает несколько значений одновременно
ПроизводительностьМедленнее (больше пропусков в кэше процессора)Быстрее (оптимизировано для процессора, снижает узкие места в памяти)
Использование процессораНедоиспользуется процессорПолностью использует возможности современных процессоров (SIMD, локальность кэша)
Лучше всего дляТранзакционные нагрузки (OLTP)Аналитические нагрузки (OLAP)

Пример векторизованного выполнения

Предположим, мы хотим суммировать все значения в столбце.

Традиционное (построчное) выполнение

Процессор загружает одну строку за раз в регистры. Выполняет вычисление (например, суммирование) построчно. Неэффективно из-за пропусков в кэше процессора и задержек памяти.

sum = 0 for row in data:     sum += row["value"]

Векторизованное выполнение

Загружает пакет значений сразу в регистры процессора. Использует инструкции SIMD (например, AVX, SSE) для параллельной обработки нескольких значений. Значительно быстрее благодаря снижению нагрузки на память.

sum_vectorized = np.sum(data["value"])  # Использует операции SIMD внутри

Пример векторизованного выполнения в реальной жизни: ClickHouse

ClickHouse нативно поддерживает векторизованное выполнение запросов. Когда выполняются операции, такие как:

SELECT SUM(price) FROM sales;

ClickHouse:

  • Загружает пакетами значения столбца в регистры процессора.
  • Применяет инструкции SIMD для суммирования нескольких значений за один цикл процессора.
  • Избегает ненужной построчной обработки.

Этот подход делает ClickHouse значительно быстрее для аналитических запросов по сравнению с традиционными построчными OLAP базами данных.

Почему векторизованное выполнение важно?

✅ Огромное ускорение для OLAP-запросов (до 10 раз быстрее, чем построчное выполнение).
✅ Эффективное использование процессора (использует инструкции SIMD и алгоритмы, удобные для кэша).
✅ Сниженная нагрузка на пропускную способность памяти (обрабатывает данные пакетами).
✅ Идеально подходит для столбцовых баз данных, таких как ClickHouse, Vertica, DuckDB, Snowflake, Apache Arrow.

Базы данных, использующие векторизованное выполнение:

ClickHouse → Полностью векторизованный движок выполнения
Vertica → Использует векторизованные проекции для быстрой аналитики
BigQuery & Snowflake → Внутренне оптимизированы для столбцовой обработки
DuckDB & Apache Arrow → Полностью векторизованное выполнение в памяти