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