Take the zone report a measurement that disproved its own long-standing worry about a per-row probe

This commit is contained in:
heaven 2026-09-06 03:02:06 +03:00
parent 6f08e59784
commit 0eb8511a8c

View file

@ -853,10 +853,30 @@ status` на входе сессии — clean). В него ВХОДИТ `81a89
зоны. Цена, если да: одна колонка `runs.ordered_characters` и поле на проводе; ничьей арифметики это
не трогает. Найдено ревью коллеги-Fable 06.09, проверено зоной по коду. **В состав минора НЕ
внесено** — по слову оркестратора.
- **Стоимость чтения формы заказа выросла и НЕ ЗАМЕРЕНА.** Отчёт празднует снятие квадратичности в
`Affordable` на этом же пути — честно тогда сказать и про добавленное: остаток книги теперь
агрегируется ПО ЮНИТАМ с коррелированным `not exists` на каждый, вместо одной строки на главу. На
книге в 2283 главы это тысячи проб на каждый поллинг. План я не снимала.
- ✅ **Стоимость чтения формы заказа — ЗАМЕРЕНА 06.09, И ЗАМЕР ОПРОВЕРГ МОЁ ЖЕ ОПАСЕНИЕ.** Здесь стояло:
«остаток агрегируется ПО ЮНИТАМ с коррелированным `not exists` на каждый… на книге в 2283 главы это
**тысячи проб на каждый поллинг**. План я не снимала». Механизм назван НЕВЕРНО.
Снято `EXPLAIN (ANALYZE, BUFFERS)` на книге **2000 глав × 3 юнита** (6000 юнитов, четверть уже
доставлена, после `analyze`), одноразовой пробой, удалённой в том же заходе:
```
Planning Time 1.061 ms · Execution Time 9.585 ms · Buffers: shared hit=143, нулевое чтение с диска
Sort → HashAggregate (2000 групп) → Hash Anti Join (6000 × 1500)
ReadBookForOrder целиком (два запроса + сканы): best of 5 = 11.3 ms
```
Планировщик **переписывает коррелированный `not exists` в HASH ANTI JOIN** — один проход по обеим
сторонам, а не проба на юнит. «Тысяч проб» не существует ни при каком размере книги; растёт это
линейно, а не как произведение.
**ГРАНИЦА ЗАМЕРА, и без неё цитировать нельзя:** в таблицах пробы лежала ОДНА книга, поэтому
нижние узлы — `Seq Scan` по `units` и `chapters`. На заполненном деплое их место займёт индексный
скан по `book_id`, то есть настоящая цена, скорее всего, НИЖЕ измеренной, но форма плана может
оказаться другой. Замерено на пустом соседстве; на боевом — нет.
⚠ И почему это стоит записать отдельно: моё опасение было СВЯЗНЫМ (коррелированный подзапрос ⇒
проба на строку) и потому читалось как знание. Прибор ответил иначе за десять минут работы. Это
третий случай за пак, когда рассуждение проиграло исполнению, и единственный, где я успела снять
замер до того, как утверждение кто-то процитировал.
- **Из второго круга НЕ починено и названо поимённо:** ⑴ sqlc-подстановка `*.*_micro_usd → MicroUSD`
не различает NULLABLE, а миграция намеренно делает три денежные колонки `books` nullable — сегодня
это ничего не ломает (рукописный код читает их как `*int64` и конвертирует сам, `sqlc diff` чист),