Читальный зал: чем меряют ответ

Собрать первый ответ и снять его цену

22 мин
Чему научишься
  • собирать готовый ответ выдачи и обосновывать его цену
  • оценивать чужой запрос по двум числам и понимать, читает ли он лишнее
  • видеть карту курса: восемь глав как восемь слоёв одного ответа
  • понимать честную рамку курса: что здесь исполняется живьём, что заменено и чего нет совсем

Первый ответ в панели

Конец первой смены. Смотритель приходит за первым готовым ответом для панели: какие посетители получили больше всего материалов и какую долю своих заказов довели до получения.

Для этого вопроса не нужно идти к сырым событиям. В зале уже есть витрина dm_vydacha: одна строка на визит, где собрано, сколько действий совершил посетитель, сколько материалов он тронул, заказал и получил.

Это твоя витрина. Дежурный по выдаче собирает её в свою смену, а посетители весь день читают её по одному вопросу за раз.

Не путай её с витриной, которую ночью наполняет лента приёмного уровня. Там другой писатель, другой читатель и другой ключ.

Сам ответ соберём обычной агрегацией по готовой витрине. Приёмы главы закрепишь в задачах ниже, а здесь пройдёшь весь цикл: сначала получишь правильные числа, затем снимешь цену по правилу, которое КВЕРИ задал ещё в первом уроке.

Та же панель из восьми ячеек, что и в первом уроке: первая заполнена короткой таблицей из пяти строк и отдельной строкой из трёх показателей цены, остальные семь тёмные; рядом раскрыт журнал с одной исписанной строкой, смотритель уходит из кадра.
Одна ячейка из восьми загорелась: у ответа появилась и цена.
Сначала сам ответ: пять посетителей, которые получили больше всего материалов, и доля выполненных заказов у каждого. Считаем по витрине зала — по одной строке на визит. Цену разберём следом.

Как читать чужой ответ

Ответ готов. У запроса нет фильтра, поэтому он читает витрину целиком: 5272 строки и 5 засечек. Теперь разберём, по каким числам видно, что запрос читает лишнее.

Для первой проверки достаточно двух чисел: сколько строк прочитано и сколько засечек задето.

Число строк показывает, какую часть таблицы прочитал движок. По засечкам видно, сколько гранул затронул запрос.

Если прочитано столько же строк, сколько всего есть в таблице, заранее отбросить ничего не получилось. Запрос прошёл таблицу целиком — даже если в ответе осталась одна строка.

Теперь посмотрим, откуда берётся разница в цене у двух похожих вопросов.

Витрина зала разложена по посетителю и времени. Поэтому фильтр по посетителю совпадает с началом ключа сортировки: движок может пропустить лишние гранулы ещё до чтения.

Дата в ключ сортировки не входит. Поэтому вопрос про день задевает все пять засечек мартовского куска и читает витрину целиком.

В следующей ячейке оба вопроса стоят рядом. Смотри не на размер ответа, а на цену чтения.

Восемь глав — восемь слоёв одного ответа

Первая ячейка панели готова, но сама панель рассчитана на восемь. Каждая следующая глава добавит к той же выдаче ещё один слой:

  1. Чем меряют — ответ, у которого есть цена. Эта глава.
  2. Точность счёта — число, рядом с которым написано, насколько оно точное.
  3. Списки — ответ, который в строчной базе потребовал бы соединения.
  4. Путь посетителя — дошёл ли, в каком порядке, вернулся ли.
  5. Время — дневной ряд, в котором нет пропусков.
  6. Раскладка — тот же ответ вдвое дешевле, и это доказано числом.
  7. Соединения — ответ со справочником, который поместился в память.
  8. Выдача сдана — всё вместе, на двух машинах, и экзамен.

Главы не начинаются с чистого листа. Приёмы накапливаются, а журнал в три колонки идёт через весь курс: вопрос, приём, цена.

КВЕРИ: Первая ячейка заполнена. Заметь: про посетителя ты спросил дёшево. Спроси ту же витрину про день — и цена изменится. Сейчас измерь разницу; раскладку исправишь в шестой главе.

Два вопроса к одной витрине: про посетителя и про день. Фильтр по посетителю оставляет одну гранулу, а вопрос про день, как и первый ответ без фильтра, читает витрину целиком. Сравни два последних числа: сколько строк пришлось прочитать и сколько засечек задел запрос.

Честная рамка курса

Первый ответ и его цена готовы. Впереди ещё семь глав. Поэтому сейчас важно понять, что в песочнице настоящее, что заменено учебной моделью, а чего здесь нет совсем.

Исполняется живьём: всё, что ты видишь в ячейках. Настоящий ClickHouse 24.10, настоящий разбор запроса, настоящие планы и настоящие сообщения об ошибках — дословно те же, что встретятся в работе.

Данные зала загружаются заново перед каждым исполнением. Поэтому испортить их нельзя, а изменённый тобой запрос исполняется сразу.

Заменено, и в уроке об этом сказано: определение таблицы читается через DESCRIBE, а не SHOW CREATE; сведения о кусках берутся из служебной колонки, а не из служебной базы; несколько машин изображаются двумя локальными таблицами.

Это упрощает среду, но не подменяет сам механизм, который ты изучаешь.

Чего нет совсем: сети между машинами и её цены, фонового слияния под нагрузкой, дисков разной скорости, соседей по серверу.

В всё это добавит свою цену. Но базовое правило курса от этого не меняется: меньше прочитал — дешевле ответил.

Про задачи ниже. Гейт этой главы стоит на задачах, которые открываются только на ClickHouse. Диалект задаёт сама задача: решить их в PostgreSQL нельзя. Так и задумано — задачи курса по ClickHouse нужно выполнять в ClickHouse.

Вопрос с собеседования

Как это спрашивают на собеседовании

Частая формулировка: «Дан запрос — как поймёте, читает ли он лишние данные?» Ответ «посмотрю время выполнения» слишком слабый: оно зависит от нагрузки и среды.

Ждут такого порядка проверки: снять план, сравнить число прочитанных строк с размером таблицы и проверить, соответствуют ли колонки фильтра ключу сортировки таблицы.

Следующий вопрос обычно звучит так: «а если фильтр по колонке, которой нет в ключе?»

Если фильтр не совпадает с началом ключа и другого способа отсечь данные нет, заранее отбросить лишнее не получится: запрос прочитает всю таблицу. Это видно не по размеру ответа, а по числу прочитанных строк в плане.

На одной и той же витрине ты уже видел оба случая: 1024 строки против 5272.

Проверь себя
Коллега прислал запрос к витрине зала с фильтром по дню. План говорит: прочитано 5272 строки, засечек 5, в ответе одна строка. Что это значит?
Главное из урока
вопросприёмцена
Какие пять посетителей получили больше всего материалов и какова доля выполненных заказов у каждого? по витрине зала, одна строка на визит1 кусок / 5272 строки / 5 засечек
Сколько получил посетитель 43?фильтр по первой колонке ключа сортировки1024 строки / 1 засечка
Сколько выдач было 5 марта?фильтр по колонке, которой в ключе сортировки нет5272 строки / 5 засечек

Первая ячейка панели заполнена. Теперь в ней есть не только ответ, но и его цена. Следующий дежурный сможет повторить проверку по этим числам, не спрашивая тебя, что именно происходило внутри запроса.

За эту главу у тебя появился базовый набор приёмов: условие внутри агрегата, комбинаторы агрегатных функций, крайнее значение без окна. Но не менее важно другое — теперь каждый такой приём можно оценивать по цене чтения.

Дальше вопросы станут неудобнее. Первый из них звучит просто: «сколько разных?» И окажется, что у него пять разных правильных ответов.

КВЕРИ: Смена засчитана, дежурный. Одна ячейка из восьми. Витрина про день ответила дорого не потому, что плохая. Просто её кто-то так разложил. Скоро этим кем-то будешь ты.