Клауза FROM
Клауза FROM
указывает источник для чтения данных:
Клаузы JOIN и ARRAY JOIN также могут использоваться для расширения функциональности клаузи FROM
.
Подзапрос — это другой запрос SELECT
, который может быть указан в скобках внутри клаузи FROM
.
Клауза FROM
может содержать несколько источников данных, разделённых запятыми, что эквивалентно выполнению CROSS JOIN над ними.
FROM
может опционально появляться перед клаузой SELECT
. Это специфическое для ClickHouse расширение стандартного SQL, которое делает запросы SELECT
более удобными для чтения. Например:
Модификатор FINAL
Когда указан FINAL
, ClickHouse полностью объединяет данные перед возвратом результата. Это также выполняет все преобразования данных, которые происходят во время объединения для данного механизма таблицы.
Это применимо при выборе данных из таблиц с использованием следующих механизмов таблиц:
ReplacingMergeTree
SummingMergeTree
AggregatingMergeTree
CollapsingMergeTree
VersionedCollapsingMergeTree
Запросы SELECT
с FINAL
выполняются параллельно. Настройка max_final_threads ограничивает количество используемых потоков.
Недостатки
Запросы, использующие FINAL
, выполняются немного медленнее, чем аналогичные запросы, не использующие FINAL
, потому что:
- Данные объединяются во время выполнения запроса.
- Запросы с
FINAL
могут читать колонки первичного ключа в дополнение к колонкам, указанным в запросе.
FINAL
требует дополнительных вычислительных и запоминающих ресурсов, так как обработка, которая обычно происходит во время объединения, должна происходить в памяти во время выполнения запроса. Однако использование FINAL
иногда необходимо, чтобы получить точные результаты (так как данные могут еще не быть полностью объединёнными). Это менее затратный вариант, чем запуск OPTIMIZE
, чтобы принудительно выполнить объединение.
В качестве альтернативы использованию FINAL
иногда возможно применять различные запросы, которые предполагают, что фоновые процессы механизма MergeTree
ещё не произошли, и справляться с этим, применяя агрегацию (например, чтобы отбросить дубликаты). Если вам необходимо использовать FINAL
в ваших запросах, чтобы получить требуемые результаты, это нормально, но будьте внимательны к дополнительной обработке, требуемой для этого.
FINAL
можно применять автоматически с помощью настройки FINAL ко всем таблицам в запросе, используя сеанс или профиль пользователя.
Пример использования
Использование ключевого слова FINAL
Использование FINAL
в качестве настройки на уровне запроса
Использование FINAL
в качестве настройки на уровне сеанса
Подробности реализации
Если клаузу FROM
опустить, данные будут читаться из таблицы system.one
.
Таблица system.one
содержит ровно одну строку (эта таблица выполняет ту же функцию, что и таблица DUAL, найденная в других СУБД).
Для выполнения запроса все колонки, указанные в запросе, извлекаются из соответствующей таблицы. Любые колонки, не нужные для внешнего запроса, отбрасываются из подзапросов.
Если запрос не перечисляет никаких колонок (например, SELECT count() FROM t
), все равно извлекается какая-то колонка из таблицы (предпочтительно наименьшая), чтобы подсчитать количество строк.