Т.к. фильтры вставляются в запрос на лету, то он выглядит следующим образом
SELECT sum(column)
FROM table
WHERE
Date = today()
AND ($val = 1 OR Field = $val)
AND ($val2 = 1 OR Field2 = $val2)
Если $val = 1 - значит фильтровать данные не нужно. По идее, условие сразу должно вернуть true и не влиять на производительность запроса. Но это влияние есть и оно весьма заметно.
Есть у кого-то идеи, как это можно оптимизировать?
clickhouse вычисляет все аргументы and/or, все аргументы if, итд. т.к. они векторизуются и вычисляются пачками и потом пачками над ними выполняются последующие функции. мы такие вещи оптимизируем перед генерацией запроса: вычисляем выражения, известные статически, выбразываем бесполезные условия, итд. правда в вашем запросе это не помогло бы, т.к. в зависимости от строки таблицы каждое из условий может оказаться значимым, это можно только при выполнении оптимизировать.
Обсуждают сегодня