Перейти к основному содержимому
Перейти к основному содержимому

Клауза 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), все равно извлекается какая-то колонка из таблицы (предпочтительно наименьшая), чтобы подсчитать количество строк.