Выбор ответа Middle ClickHouse и колоночные СУБД спрашивают часто обновлено
Выбор сортировочного ключа
Вопрос
Запросы к таблице событий почти всегда фильтруют по project_id и диапазону event_time, иногда по user_id. Какой ORDER BY разумнее?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: (projectid, eventtime) или (projectid, toDate(eventtime), userid): сначала постоянный фильтр. Индекс эффективно сужает чтение по префиксу ключа.
Варианты ответа
(project_id, event_time)или(project_id, toDate(event_time), user_id): сначала постоянный фильтрправильный ответ(event_time, project_id): время ставят первым, иначе диапазонные фильтры по нему не работают(user_id): колонка с самой высокой кардинальностью даёт индексу наилучшую селективностьtuple(): без сортировки вставка быстрее, а нужные строки отсекут партиции по месяцу
Разбор
Индекс эффективно сужает чтение по префиксу ключа. Если первым стоит project_id, данные проекта лежат вместе, а внутри них по времени, и фильтр по обоим работает. Время первым разбросает проект по всей таблице: фильтр по проекту почти не сузит чтение. Один user_id не поможет основным запросам. Без сортировки индекс бесполезен и хуже сжатие.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «ClickHouse и колоночные СУБД»
- Специальные движки MergeTree
- Как устроен MergeTree
- Чтение из ReplacingMergeTree
- Какие гранулы прочитает ClickHouse
- Таблица MergeTree
- Счётчик в материализованном представлении
- Как работает материализованное представление
- Что задаёт ORDER BY в MergeTree