Обзор проекций
- Выполнение запросов по столбцу, который не входит в первичный ключ
- Предварительная агрегация столбцов, что снижает как вычислительные затраты, так и объём операций ввода-вывода
Использование дискаПроекции внутренне создают новую скрытую таблицу, а это значит, что потребуется больше операций ввода-вывода и места на диске.
Например, если для проекции задан другой первичный ключ, все данные из исходной таблицы будут дублироваться.
Использование проекций
Пример фильтрации без использования первичных ключей
ALTER TABLE можно добавить проекцию в существующую таблицу:
user_name, даже если в исходной таблице user_name не был определён как PRIMARY_KEY.
Во время выполнения запроса ClickHouse определяет, что при использовании проекции будет обработано меньше данных, так как данные упорядочены по user_name.
system.query_log. В поле projections указано имя использованной проекции или пустое значение, если проекция не использовалась:
Пример запроса с предварительной агрегацией
projection_visits_by_user:
GROUP BY, используя поле user_agent.
Этот запрос не будет использовать проекцию, так как предварительная агрегация ему не соответствует.
GROUP BY:
system.query_log, чтобы понять, использовалась ли проекция.
Поле projections показывает имя использованной проекции.
Оно будет пустым, если проекция не использовалась:
Создание и использование индексов-проекций
_part_offset сохраняет своё значение при слияниях и мутациях, что делает его полезным для вторичной индексации. Это можно использовать в запросах:
Управление проекциями
ADD PROJECTION
Конструкция WITH SETTINGS
WITH SETTINGS определяет настройки уровня проекции, которые задают, как проекция хранит данные (например, index_granularity или index_granularity_bytes).
Они напрямую соответствуют настройкам таблиц семейства MergeTree, но применяются только к этой проекции.
Пример:
DROP PROJECTION
MATERIALIZE PROJECTION
name в партиции partition_name.
Это реализовано как мутация.
CLEAR PROJECTION
ADD, DROP и CLEAR считаются легковесными, поскольку изменяют только метаданные или удаляют файлы.
Кроме того, эти команды реплицируются и синхронизируют метаданные проекций через ClickHouse Keeper или ZooKeeper.
Операции с проекциями поддерживаются только для таблиц с движком
таблица семейства *MergeTree (включая реплицируемые варианты).Управление поведением слияния проекций
ReplacingMergeTree.
Если во время слияния в нескольких входных частях обнаруживается одна и та же строка, сохраняется только самая новая версия строки (из части, вставленной последней), а все более старые версии отбрасываются.
Аналогично, если таблица использует движок таблицы AggregatingMergeTree, операция слияния может сворачивать одинаковые строки во входных частях (на основе значений первичного ключа) в одну строку, чтобы обновить промежуточные состояния агрегации.
До ClickHouse v24.8 части проекций либо незаметно рассинхронизировались с основными данными, либо некоторые операции, такие как обновления и удаления, вообще нельзя было выполнять, поскольку база данных автоматически генерировала исключение, если у таблицы были проекции.
Начиная с v24.8, новый параметр уровня таблицы deduplicate_merge_projection_mode управляет поведением в случае, если вышеупомянутые нетривиальные фоновые операции слияния происходят в частях исходной таблицы.
Мутации удаления — ещё один пример операций слияния частей, при которых удаляются строки в частях исходной таблицы. Начиная с v24.7, также есть параметр для управления поведением в отношении мутаций удаления, запускаемых легковесными удалениями: lightweight_mutation_projection_mode.
Ниже приведены возможные значения для deduplicate_merge_projection_mode и lightweight_mutation_projection_mode:
throw(по умолчанию): генерируется исключение, что не позволяет частям проекций рассинхронизироваться.drop: Затронутые части таблицы проекций удаляются. Для таких частей запросы будут выполняться по исходной части таблицы.rebuild: Затронутая часть проекции перестраивается, чтобы оставаться согласованной с данными в части исходной таблицы.
Ограничения
ALIAS в предложении ORDER BY проекции. Например:
ALIAS физически не хранятся и вычисляются на лету во время выполнения запроса, поэтому они недоступны при записи части проекции, когда вычисляется выражение сортировки.
Вместо этого используйте столбцы MATERIALIZED или встроите выражение напрямую: