Выбор ответа Senior ClickHouse и колоночные СУБД обновлено

Счётчик в материализованном представлении

Вопрос

MV пишет SELECT event_date, count() AS cnt FROM events GROUP BY event_date в целевую таблицу на обычном MergeTree. Дашборд показывает по нескольку строк на дату с разными cnt. В чём ошибка?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Агрегат считается для каждого блока вставки отдельно; нужна SummingMergeTree и sum(cnt) в запросе. MV видит только текущий блок, а не всю таблицу.

Варианты ответа

  1. Агрегат считается для каждого блока вставки отдельно; нужна SummingMergeTree и sum(cnt) в запросеправильный ответ
  2. count() в MV не поддерживается, вместо него нужно писать sum(1), иначе счёт идёт отдельно по каждому блоку
  3. Нужно добавить FINAL в определение MV, тогда агрегат будет считаться по всей исходной таблице
  4. MergeTree удаляет строки с одинаковым ключом при слияниях, и часть счётчиков теряется

Разбор

MV видит только текущий блок, а не всю таблицу. Каждая вставка добавляет свою строку на дату с частичным счётом. SummingMergeTree сложит их при слияниях, но до слияния строки всё равно разные, поэтому запрос к целевой таблице всегда делает sum(cnt) GROUP BY event_date. Для уникальных пользователей нужен uniqState и uniqMerge. count() поддерживается. FINAL в определении MV не решает задачу. Обычный MergeTree ничего не удаляет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.