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