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

Секция FROM

Секция FROM задаёт источник, из которого читаются данные:

Секции JOIN и ARRAY JOIN также могут использоваться для расширения функциональности секции FROM.

Подзапрос — это другой запрос SELECT, который может быть указан в скобках внутри секции FROM.

FROM может содержать несколько источников данных, разделённых запятыми, что эквивалентно выполнению над ними CROSS JOIN.

FROM может опционально располагаться перед секцией SELECT. Это специфичное для ClickHouse расширение стандартного SQL, которое делает запросы SELECT более читаемыми. Пример:

FROM table
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

SELECT x, y FROM mytable FINAL WHERE x > 1;

Использование FINAL в качестве параметра уровня запроса

SELECT x, y FROM mytable WHERE x > 1 SETTINGS final = 1;

Использование FINAL в качестве параметра на уровне сеанса

SET final = 1;
SELECT x, y FROM mytable WHERE x > 1;

Подробности реализации

Если предложение FROM опущено, данные будут прочитаны из таблицы system.one. Таблица system.one содержит ровно одну строку (эта таблица выполняет ту же роль, что и таблица DUAL в других СУБД).

Для выполнения запроса все столбцы, перечисленные в запросе, извлекаются из соответствующей таблицы. Любые столбцы, не нужные для внешнего запроса, отбрасываются в подзапросах. Если запрос не перечисляет ни одного столбца (например, SELECT count() FROM t), из таблицы всё равно извлекается один из столбцов (предпочтение отдаётся наименьшему по размеру), чтобы вычислить количество строк.