Проекции
Прогнозы (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 (включая реплицированные варианты).