From 0eb8511a8c4900654625e34ba578a9ca8ee4f764 Mon Sep 17 00:00:00 2001 From: heaven Date: Sun, 6 Sep 2026 03:02:06 +0300 Subject: [PATCH] Take the zone report a measurement that disproved its own long-standing worry about a per-row probe --- platform/docs/platform-PROGRESS.md | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/platform/docs/platform-PROGRESS.md b/platform/docs/platform-PROGRESS.md index 8dae3546..dff26e7b 100644 --- a/platform/docs/platform-PROGRESS.md +++ b/platform/docs/platform-PROGRESS.md @@ -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` чист),