1. Проекции (Vertica)

В Vertica вместо традиционных индексов используются проекции для оптимизации производительности запросов.

Что такое проекции?

Проекция — это предварительно оптимизированная физическая структура хранения, которая определяет, как данные хранятся и упорядочиваются. В отличие от традиционных индексов, проекции не являются отдельными структурами; это альтернативные, оптимизированные представления данных таблицы. Они хранят данные в столбцовом формате и позволяют эффективно выполнять запросы.

Типы проекций в Vertica

  • Superprojection — стандартная проекция, содержащая все столбцы таблицы.
  • Aggregate Projection — хранит предварительно агрегированные данные для ускорения групповых запросов.
  • Live Aggregate Projection — непрерывно обновляет предварительно агрегированные значения.
  • Segmented Projection — использует хеш-сегментацию для распределения данных по узлам.
  • Partitioned Projection — организует данные в разделы для ускорения обрезки (pruning).

Как проекции улучшают производительность запросов

  • Проекции хранят данные, отсортированные таким образом, чтобы соответствовать шаблонам запросов, что уменьшает необходимость фильтрации больших наборов данных.
  • Они устраняют необходимость в индексах, напрямую улучшая производительность чтения.
  • Vertica автоматически выбирает лучшую проекцию для эффективного выполнения запроса.

Пример проекции в Vertica

CREATE PROJECTION sales_projection AS 
SELECT 
	customer_id,
	product_id,
	SUM(amount) AS total_sales 
FROM sales 
GROUP BY customer_id, product_id;

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


2. Ключи кластеризации (BigQuery)

Google BigQuery не использует индексы. Вместо этого он полагается на ключи кластеризации и партиционирование для оптимизации выполнения запросов.

Что такое ключ кластеризации?

Кластеризация организует данные внутри разделов на основе определенных столбцов. Она улучшает производительность, уменьшая количество данных, которые необходимо сканировать при выполнении запросов. Запросы, фильтрующие по ключу кластеризации, сканируют только соответствующие диапазоны столбцов, а не весь набор данных.

Как работает кластеризация в BigQuery

Когда вы записываете данные, BigQuery автоматически сортирует строки на основе ключа кластеризации. Запросы, использующие кластеризованный столбец в фильтрах (WHERE), выполняются намного быстрее, поскольку сканируются только соответствующие разделы.

Пример кластеризации в BigQuery

CREATE TABLE sales (
	customer_id STRING,
	transaction_date DATE,
	amount FLOAT 
) 
PARTITION BY DATE(transaction_date) 
CLUSTER BY customer_id;

Партиционирование происходит по столбцу transaction_date, что означает, что запросы на определенные даты будут быстрее. Кластеризация происходит по столбцу customer_id, что означает, что запросы с фильтром по клиенту избегают полных сканирований.


3. Зональные карты (Zone Maps) (Vertica и ClickHouse)

Как Vertica, так и ClickHouse используют зональные карты как эффективный способ ускорения запросов без использования традиционных индексов.

Что такое зональная карта?

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

Как работают зональные карты

Данные хранятся в чанках (называемых блоками хранения). Каждый блок имеет свою зональную карту, которая отслеживает:

  • Минимальное и максимальное значения для каждого столбца в этом блоке. Когда выполняется запрос, движок пропускает блоки, где диапазон не соответствует запросу.

Пример работы зональной карты

Предположим, есть таблица, хранящая логи с колонкой timestamp:

Блок №Мин. TimestampМакс. Timestamp
Блок 12023-01-012023-01-10
Блок 22023-01-112023-01-20
Блок 32023-01-212023-01-31

Теперь, если вы выполните запрос:

SELECT * FROM logs WHERE timestamp = '2023-01-05';

Система будет сканировать только блок 1, пропуская блоки 2 и 3 полностью, что делает запрос очень быстрым.

Зональные карты в ClickHouse (Сортировка по первичному ключу)

Таблицы ClickHouse с движком MergeTree используют сортировку по первичному ключу для улучшения эффективности запросов. Вместо традиционных индексов, ClickHouse сортирует данные на диске по первичному ключу и использует внутренние зональные карты. Это означает, что запросы по отсортированным полям не сканируют ненужные данные.


Финальная таблица сравнения

ХарактеристикаПроекции (Vertica)Ключи кластеризации (BigQuery)Зональные карты (ClickHouse и Vertica)
ЦельОптимизированное хранение для выполнения запросовУскоряет запросы, организуя данные эффективноУменьшает количество сканируемых данных, пропуская нерелевантные блоки
Тип индексаНет традиционного индекса, оптимизированная структура храненияНет индекса, но данные сортируются полезным образомНе индекс, метаданные отслеживают минимальные/максимальные значения
Лучше всего дляПредварительно вычисленные агрегации, оптимизированный доступ к даннымБыстрый доступ к часто фильтруемым полямЗапросы по диапазонам, фильтрация по отсортированным столбцам
Как работаетПредварительно отсортированное альтернативное хранениеАвтоматически сортирует и группирует строкиПропускает нерелевантные блоки данных
ОбновленияУправляются автоматически в VerticaУправляются автоматически в BigQueryАвтоматические обновления при добавлении новых данных

Основные выводы

  • Проекции Vertica — предварительно вычисленные структуры, оптимизированные для эффективных запросов, заменяют необходимость в индексах.
  • Ключи кластеризации BigQuery — помогают запросам сканировать меньше данных, сортируя и группируя данные в пределах разделов.
  • Зональные карты (ClickHouse и Vertica) — хранят метаданные min/max для обрезки нерелевантных блоков и ускорения запросов.