Помогите разобраться с SQL запросом к ClickHouse

Всем привет! Наткнулся на такую задачку:

Даны две таблицы в Clickhouse, в каждой из которых по 100 млн+ строк и возможны дубликаты. Каждый день обновляется около 1 млн продуктов (то есть на 2 порядка меньше, чем строк в таблице).

CREATE TABLE products (
    product_id Int32, 
    product_name String, 
    brand_id Int32, 
    seller_id Int32, 
    updated Date
    ) ENGINE = ReplacingMergeTree ORDER BY product_id
CREATE TABLE remainders (
    date Date, 
    product_id Int32, 
    remainder Int32, 
    price Int32, 
    discount Int32, 
    pics Int32, 
    rating Int32, 
    reviews Int32, 
    new Bool
    ) ENGINE = ReplacingMergeTree ORDER BY (date, product_id)

Напиши 3 причины, по которым следующий запрос выполняется медленно (5 секунд) и предложи быструю версию запроса (<0.1 секунды :), без изменений архитектуры таблиц (не надо предлагать "добавить индексы") и дающую такой же результат:

select product_id 
from products final 
join remainders final using(product_id) 
where updated=today() and date=today()-1

Сижу с ней уже пару дней, но решение что-то пока не приходит. Буду благодарен за любые полезные мысли или полноценное решение.


Ответы (2 шт):

Автор решения: TheRetroHome

Ох блин увидел final и сразу вспомнил что он достаточно ресурсоемкая конфетка. Желательно конечно воздерживаться от его использования. В идеале бы сделать предфильтрацию а только потом join, на крайняк попробовать сделать подзапросы

→ Ссылка
Автор решения: ValNik

Если речь идет об одном 1%, можно попробовать сделать так

select x.product_id 
from (select product_id from products final where updated=today() 
   ) x 
join (select product_id from remainders final where date=today()-1
   ) y 
 using(product_id) 

можно надеяться на сокращение на 2-4 порядка :)

→ Ссылка