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