Помогите разобраться с 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 шт):
Ох блин увидел final и сразу вспомнил что он достаточно ресурсоемкая конфетка. Желательно конечно воздерживаться от его использования. В идеале бы сделать предфильтрацию а только потом join, на крайняк попробовать сделать подзапросы
Если речь идет об одном 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 порядка :)