Перейти к основному содержимому
Перейти к основному содержимому

Проекции

Проекции хранят данные в формате, оптимизирующем выполнение запросов, что полезно для:

  • Выполнения запросов по колонке, которая не является частью первичного ключа
  • Предагрегирования колонок, что снизит как вычисления, так и ввод-вывод

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

Использование диска

Проекции создадут внутри новую скрытую таблицу, это означает, что потребуется больше операций ввода-вывода и дискового пространства. Например, если проекция определяет другой первичный ключ, все данные из оригинальной таблицы будут продублированы.

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

Пример фильтрации без использования первичных ключей

Создание таблицы:

Используя ALTER TABLE, мы можем добавить проекцию в существующую таблицу:

Вставка данных:

Проекция позволит нам быстро фильтровать по user_name, даже если в оригинальной таблице user_name не был определен как PRIMARY_KEY. Во время выполнения запроса ClickHouse определил, что будет обработано меньше данных, если будет использована проекция, так как данные упорядочены по user_name.

Чтобы проверить, что запрос использует проекцию, мы можем просмотреть таблицу system.query_log. В поле projections указано имя использованной проекции или пусто, если ни одна не была использована:

Пример запроса предагрегирования

Создание таблицы с проекцией:

Вставка данных:

Мы выполним первый запрос, используя GROUP BY, по полю user_agent, этот запрос не использует определенную проекцию, так как предагрегирование не соответствует.

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

Как уже упоминалось, мы можем просмотреть таблицу system.query_log. В поле projections указано имя использованной проекции или пусто, если ни одна не была использована:

Управление проекциями

Доступны следующие операции с проекциями:

ADD PROJECTION

ALTER TABLE [db.]name [ON CLUSTER cluster] ADD PROJECTION [IF NOT EXISTS] name ( SELECT <COLUMN LIST EXPR> [GROUP BY] [ORDER BY] ) - Добавляет описание проекции в метаданные таблиц.

DROP PROJECTION

ALTER TABLE [db.]name [ON CLUSTER cluster] DROP PROJECTION [IF EXISTS] name - Удаляет описание проекции из метаданных таблиц и удаляет файлы проекции с диска. Реализовано как мутация.

MATERIALIZE PROJECTION

ALTER TABLE [db.]table [ON CLUSTER cluster] MATERIALIZE PROJECTION [IF EXISTS] name [IN PARTITION partition_name] - Запрос восстанавливает проекцию name в партиции partition_name. Реализовано как мутация.

CLEAR PROJECTION

ALTER TABLE [db.]table [ON CLUSTER cluster] CLEAR PROJECTION [IF EXISTS] name [IN PARTITION partition_name] - Удаляет файлы проекции с диска без удаления описания. Реализовано как мутация.

Команды ADD, DROP и CLEAR являются легковесными в том смысле, что они только изменяют метаданные или удаляют файлы.

Кроме того, они реплицируются, синхронизируя метаданные проекций через ClickHouse Keeper или ZooKeeper.

примечание

Манипуляции с проекциями поддерживаются только для таблиц с движком *MergeTree (включая реплицированные варианты).