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

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