Счётчик в материализованном представлении
Вопрос
MV пишет SELECT event_date, count() AS cnt FROM events GROUP BY event_date в целевую таблицу на обычном MergeTree. Дашборд показывает по нескольку строк на дату с разными cnt. В чём ошибка?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Агрегат считается для каждого блока вставки отдельно; нужна SummingMergeTree и
sum(cnt)в запросеправильный ответ - count() в MV не поддерживается, вместо него нужно писать sum(1), иначе счёт идёт отдельно по каждому блоку
- Нужно добавить FINAL в определение MV, тогда агрегат будет считаться по всей исходной таблице
- MergeTree удаляет строки с одинаковым ключом при слияниях, и часть счётчиков теряется
Разбор
MV видит только текущий блок, а не всю таблицу. Каждая вставка добавляет свою строку на дату с частичным счётом. SummingMergeTree сложит их при слияниях, но до слияния строки всё равно разные, поэтому запрос к целевой таблице всегда делает sum(cnt) GROUP BY event_date. Для уникальных пользователей нужен uniqState и uniqMerge. count() поддерживается. FINAL в определении MV не решает задачу. Обычный MergeTree ничего не удаляет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.