Выбор ответа Middle ClickHouse и колоночные СУБД спрашивают часто обновлено

Выбор сортировочного ключа

Вопрос

Запросы к таблице событий почти всегда фильтруют по project_id и диапазону event_time, иногда по user_id. Какой ORDER BY разумнее?

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

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

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

Коротко

Правильный ответ: (projectid, eventtime) или (projectid, toDate(eventtime), userid): сначала постоянный фильтр. Индекс эффективно сужает чтение по префиксу ключа.

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

  1. (project_id, event_time) или (project_id, toDate(event_time), user_id): сначала постоянный фильтрправильный ответ
  2. (event_time, project_id): время ставят первым, иначе диапазонные фильтры по нему не работают
  3. (user_id): колонка с самой высокой кардинальностью даёт индексу наилучшую селективность
  4. tuple(): без сортировки вставка быстрее, а нужные строки отсекут партиции по месяцу

Разбор

Индекс эффективно сужает чтение по префиксу ключа. Если первым стоит project_id, данные проекта лежат вместе, а внутри них по времени, и фильтр по обоим работает. Время первым разбросает проект по всей таблице: фильтр по проекту почти не сузит чтение. Один user_id не поможет основным запросам. Без сортировки индекс бесполезен и хуже сжатие.

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

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