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

FROM Clause

Клауза FROM указывает источник для чтения данных:

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

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

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

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

FROM table
SELECT *

FINAL Modifier

Когда указано FINAL, ClickHouse полностью объединяет данные перед возвратом результата. Это также выполняет все преобразования данных, которые происходят во время объединений для данного движка таблицы.

Это применимо при выборке данных из таблиц, используя следующие движки таблицы:

  • ReplacingMergeTree
  • SummingMergeTree
  • AggregatingMergeTree
  • CollapsingMergeTree
  • VersionedCollapsingMergeTree

Запросы SELECT с FINAL выполняются параллельно. Настройка max_final_threads ограничивает количество используемых потоков.

Drawbacks

Запросы, которые используют FINAL, выполняются немного медленнее, чем аналогичные запросы, не использующие FINAL, потому что:

  • Данные объединяются во время выполнения запроса.
  • Запросы с FINAL могут читать столбцы первичного ключа в дополнение к столбцам, указанным в запросе.

FINAL требует дополнительных вычислительных и оперативных ресурсов, так как обработка, которая обычно происходит во время объединения, должна происходить в памяти во время запроса. Однако, использование FINAL иногда необходимо для получения точных результатов (так как данные могут ещё не быть полностью объединены). Это менее затратно, чем запуск OPTIMIZE, чтобы принудить объединение.

В качестве альтернативы использованию FINAL, иногда возможно использовать разные запросы, которые предполагают, что фоновые процессы движка MergeTree ещё не произошли, и справиться с этим, применяя агрегацию (например, для отбрасывания дубликатов). Если вам необходимо использовать FINAL в ваших запросах для получения требуемых результатов, вы можете это сделать, но будьте готовы к дополнительной обработке.

FINAL может быть автоматически применен с использованием настройки FINAL ко всем таблицам в запросе с использованием сессии или профиля пользователя.

Example Usage

Использование ключевого слова 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;

Implementation Details

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

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