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

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