Собрать первый ответ и снять его цену
Чему научишься
- собирать готовый ответ выдачи и обосновывать его цену
- оценивать чужой запрос по двум числам и понимать, читает ли он лишнее
- видеть карту курса: восемь глав как восемь слоёв одного ответа
- понимать честную рамку курса: что здесь исполняется живьём, что заменено и чего нет совсем
Первый ответ в панели
Конец первой смены. Смотритель приходит за первым готовым ответом для панели: какие посетители получили больше всего материалов и какую долю своих заказов довели до получения.
Для этого вопроса не нужно идти к сырым событиям. В зале уже есть витрина dm_vydacha: одна строка на визит, где собрано, сколько действий совершил посетитель, сколько материалов он тронул, заказал и получил.
Это твоя витрина. Дежурный по выдаче собирает её в свою смену, а посетители весь день читают её по одному вопросу за раз.
Не путай её с витриной, которую ночью наполняет лента приёмного уровня. Там другой писатель, другой читатель и другой ключ.
Сам ответ соберём обычной агрегацией по готовой витрине. Приёмы главы закрепишь в задачах ниже, а здесь пройдёшь весь цикл: сначала получишь правильные числа, затем снимешь цену по правилу, которое КВЕРИ задал ещё в первом уроке.

Как читать чужой ответ
Ответ готов. У запроса нет фильтра, поэтому он читает витрину целиком: 5272 строки и 5 засечек. Теперь разберём, по каким числам видно, что запрос читает лишнее.
Для первой проверки достаточно двух чисел: сколько строк прочитано и сколько засечек задето.
Число строк показывает, какую часть таблицы прочитал движок. По засечкам видно, сколько гранул затронул запрос.
Если прочитано столько же строк, сколько всего есть в таблице, заранее отбросить ничего не получилось. Запрос прошёл таблицу целиком — даже если в ответе осталась одна строка.
Теперь посмотрим, откуда берётся разница в цене у двух похожих вопросов.
Витрина зала разложена по посетителю и времени. Поэтому фильтр по посетителю совпадает с началом ключа сортировки: движок может пропустить лишние гранулы ещё до чтения.
Дата в ключ сортировки не входит. Поэтому вопрос про день задевает все пять засечек мартовского куска и читает витрину целиком.
В следующей ячейке оба вопроса стоят рядом. Смотри не на размер ответа, а на цену чтения.
Восемь глав — восемь слоёв одного ответа
Первая ячейка панели готова, но сама панель рассчитана на восемь. Каждая следующая глава добавит к той же выдаче ещё один слой:
- Чем меряют — ответ, у которого есть цена. Эта глава.
- Точность счёта — число, рядом с которым написано, насколько оно точное.
- Списки — ответ, который в строчной базе потребовал бы соединения.
- Путь посетителя — дошёл ли, в каком порядке, вернулся ли.
- Время — дневной ряд, в котором нет пропусков.
- Раскладка — тот же ответ вдвое дешевле, и это доказано числом.
- Соединения — ответ со справочником, который поместился в память.
- Выдача сдана — всё вместе, на двух машинах, и экзамен.
Главы не начинаются с чистого листа. Приёмы накапливаются, а журнал в три колонки идёт через весь курс: вопрос, приём, цена.
КВЕРИ: Первая ячейка заполнена. Заметь: про посетителя ты спросил дёшево. Спроси ту же витрину про день — и цена изменится. Сейчас измерь разницу; раскладку исправишь в шестой главе.
Честная рамка курса
Первый ответ и его цена готовы. Впереди ещё семь глав. Поэтому сейчас важно понять, что в песочнице настоящее, что заменено учебной моделью, а чего здесь нет совсем.
Исполняется живьём: всё, что ты видишь в ячейках. Настоящий ClickHouse 24.10, настоящий разбор запроса, настоящие планы и настоящие сообщения об ошибках — дословно те же, что встретятся в работе.
Данные зала загружаются заново перед каждым исполнением. Поэтому испортить их нельзя, а изменённый тобой запрос исполняется сразу.
Заменено, и в уроке об этом сказано: определение таблицы читается через DESCRIBE, а не SHOW CREATE; сведения о кусках берутся из служебной колонки, а не из служебной базы; несколько машин изображаются двумя локальными таблицами.
Это упрощает среду, но не подменяет сам механизм, который ты изучаешь.
Чего нет совсем: сети между машинами и её цены, фонового слияния под нагрузкой, дисков разной скорости, соседей по серверу.
В всё это добавит свою цену. Но базовое правило курса от этого не меняется: меньше прочитал — дешевле ответил.
Про задачи ниже. Гейт этой главы стоит на задачах, которые открываются только на ClickHouse. Диалект задаёт сама задача: решить их в PostgreSQL нельзя. Так и задумано — задачи курса по ClickHouse нужно выполнять в ClickHouse.
Вопрос с собеседования
Как это спрашивают на собеседовании
Частая формулировка: «Дан запрос — как поймёте, читает ли он лишние данные?» Ответ «посмотрю время выполнения» слишком слабый: оно зависит от нагрузки и среды.
Ждут такого порядка проверки: снять план, сравнить число прочитанных строк с размером таблицы и проверить, соответствуют ли колонки фильтра ключу сортировки таблицы.
Следующий вопрос обычно звучит так: «а если фильтр по колонке, которой нет в ключе?»
Если фильтр не совпадает с началом ключа и другого способа отсечь данные нет, заранее отбросить лишнее не получится: запрос прочитает всю таблицу. Это видно не по размеру ответа, а по числу прочитанных строк в плане.
На одной и той же витрине ты уже видел оба случая: 1024 строки против 5272.
- Просмотры и покупки по товаруEASY
- Суммарная выручка по каждому пользователюEASY
- Самый дорогой купленный товар каждого пользователяEASY
- Доля отказов по устройствамEASY
- Отказавшие и вовлечённые сессии по устройствамEASY
Главное из урока
| вопрос | приём | цена |
|---|---|---|
| Какие пять посетителей получили больше всего материалов и какова доля выполненных заказов у каждого? | по витрине зала, одна строка на визит | 1 кусок / 5272 строки / 5 засечек |
| Сколько получил посетитель 43? | фильтр по первой колонке ключа сортировки | 1024 строки / 1 засечка |
| Сколько выдач было 5 марта? | фильтр по колонке, которой в ключе сортировки нет | 5272 строки / 5 засечек |
Первая ячейка панели заполнена. Теперь в ней есть не только ответ, но и его цена. Следующий дежурный сможет повторить проверку по этим числам, не спрашивая тебя, что именно происходило внутри запроса.
За эту главу у тебя появился базовый набор приёмов: условие внутри агрегата, комбинаторы агрегатных функций, крайнее значение без окна. Но не менее важно другое — теперь каждый такой приём можно оценивать по цене чтения.
Дальше вопросы станут неудобнее. Первый из них звучит просто: «сколько разных?» И окажется, что у него пять разных правильных ответов.
КВЕРИ: Смена засчитана, дежурный. Одна ячейка из восьми. Витрина про день ответила дорого не потому, что плохая. Просто её кто-то так разложил. Скоро этим кем-то будешь ты.