6 полям (кол-во строк ~60 млрд). Есть таблица 2, в которой есть поле ID (по которому order by) и те же самые 6 полей (кол-во строк такое же).
Идея была такая: я знаю список ID (около 1 млн), по ним фильтрую таблицу 2 и делаю JOIN с таблицей 1 по 6 полям. Ожидал, что сработает ускорение запроса при использовании JOIN по всем полям, входящим в order by, но запрос висел более 10 мин и так и не выполнился. Почему не сработала идея?
SELECT
count()
FROM
table1 -- 60 млрд
JOIN
( SELECT field1, field2, field3, field4, field5, field6 -- 1 млн
FROM table2
WHERE id LIKE '2C0A%' -- единственное поле из order by table2
)
USING ( field1, field2, field3, field4, field5, field6 ) -- все поля из order by table1
*** План выполнения:
Query pipeline:
Expression
Expression
ParallelAggregating
Expression × 24
Filter
MergeTreeThread
---
Пробовал вариант с IN, тоже самое:
SELECT
count()
FROM
table1
WHERE ( field1, field2, field3, field4, field5, field6 ) IN (
SELECT field1, field2, field3, field4, field5, field6
FROM table2
WHERE id LIKE '2C0A%'
)
а ты попробуй наоборот, меньшую таблицу к большей джоинить
SELECT field1, field2, field3, field4, field5, field6 -- 1 млн FROM table2 WHERE id LIKE '2C0A%' вот этот позапрос за 10 минут выполняется или нет?
почему JOIN не стал быстрее - понятно. Оптимизации создания фильтра для MergeTree из USING JOIN-а не сделана. Обсуждение тут https://github.com/ClickHouse/ClickHouse/issues/8062 Почему нет ускорение для варианта с IN - не понятно. IN должен прокидываться в MergeTree и использовать индекс.
Обсуждают сегодня