Секция FROM
В секции FROM
указывается источник, из которого будут читаться данные:
Секция JOIN и ARRAY JOIN могут быть использованы для расширения функциональных возможностей секции FROM
.
Подзапрос — дополнительный SELECT
запрос, который может быть указан в круглых скобках внутри секции FROM
.
Секция FROM
может содержать несколько источников данных, указанных через запятую, что эквивалентно выполнению CROSS JOIN на них.
Модификатор FINAL
Если в запросе используется модификатор FINAL
, то ClickHouse полностью мёржит данные перед выдачей результата, таким образом выполняя все преобразования данных, которые производятся движком таблиц при мёржах.
Он применим при выборе данных из таблиц, использующих MergeTree- семейство движков. Также поддерживается для:
- Replicated варианты исполнения
MergeTree
движков. - View, Buffer, Distributed, и MaterializedView, которые работают поверх других движков, если они созданы для таблиц с движками семейства
MergeTree
.
Теперь SELECT
запросы с FINAL
выполняются параллельно и, следовательно, немного быстрее. Но имеются серьезные недостатки при их использовании (смотрите ниже). Настройка max_final_threads устанавливает максимальное количество потоков.
Недостатки
Запросы, которые используют FINAL
выполняются немного медленее, чем аналогичные запросы без него, потому что:
- Данные мёржатся во время выполнения запроса в памяти, и это не приводит к физическому мёржу кусков на дисках.
- Запросы с модификатором
FINAL
читают столбцы первичного ключа в дополнение к столбцам, используемым в запросе.
В большинстве случаев избегайте использования FINAL
. Общий подход заключается в использовании агрегирующих запрос ов, которые предполагают, что фоновые процессы движков семейства MergeTree
ещё не случились (например, сами отбрасывают дубликаты).
Детали реализации
Если секция FROM
опущена, данные будут считываться из таблицы system.one
.
Таблица system.one
содержит ровно одну строку.
Для выполнения запроса, из соответствующей таблицы, вынимаются все столбцы, перечисленные в запросе. Из подзапросов выкидываются столбцы, не нужные для внешнего запроса.
Если в запросе не перечислено ни одного столбца (например, SELECT count() FROM t)
, то из таблицы всё равно вынимается один какой-нибудь столбец (предпочитается самый маленький), для того, чтобы можно было посчитать количество строк.