Проекции
Проекции хранят данные в формате, оптимизирующем выполнение запросов, это полезная функция для:
- Выполнения запросов по колонке, которая не является частью первичного ключа
- Предварительной агрегации колонок, что уменьшит как вычисления, так и ввод-вывод
Вы можете определить одну или несколько проекций для таблицы, и во время анализа запроса 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
(включая реплицированные варианты).