perf(site-finder): pushdown obj_pricing CTE to nearby competitors (#70/#307) #1335

Merged
bot-backend merged 1 commit from perf/obj-pricing-pushdown into main 2026-06-14 16:58:44 +00:00
Collaborator

Summary (perf, #70/#307)

obj_pricing CTE (из OBJ-3 #1332) агрегировал objective_lots (2.1ГБ) по всем ~286 маппингам через GROUP BY domrf_obj_id, но LEFT JOIN потреблял только ~43 ближних (3км) obj_id — далёкие медианы считались зря.

Pushdown: новый nearby_obj CTE (3км-множество считается один раз) → obj_pricing scoped через WHERE cm.domrf_obj_id IN (SELECT obj_id FROM nearby_obj) → финальный SELECT FROM nearby_obj (scope == потребляемое множество структурно). Планировщик: bitmap index scan вместо full parallel seq scan.

OLD NEW
objective_lots access Parallel Seq Scan 374590×3 Bitmap Index Scan 2052×43
buffer reads 212658 (~1.66ГБ) 20561 (~10×)
exec (warm ×3) 643/726/708мс 278/281/304мс

Корректность

Байт-идентично (proven на проде): per-obj_id агрегат независим от других групп → scoping убирает только лишнюю работу. Diff OLD vs NEW на 43 ближних группах: 0 расхождений по всем 5 колонкам. Цена/fallback (#1332) не тронуты — scope-only.

Test plan

  • EXPLAIN до/после на проде (центр ЕКБ centroid)
  • byte-identity diff 43 группы → 0 mismatch
  • 3 regression-теста (pushdown predicate / FROM nearby_obj / агрегация intact) + negative control; 24 passed; ruff clean
  • code-reviewer (см. ниже)
  • post-deploy: analyze competitor block latency

Refs #70

## Summary (perf, #70/#307) `obj_pricing` CTE (из OBJ-3 #1332) агрегировал `objective_lots` (2.1ГБ) по **всем ~286 маппингам** через `GROUP BY domrf_obj_id`, но `LEFT JOIN` потреблял только **~43 ближних (3км)** obj_id — далёкие медианы считались зря. **Pushdown**: новый `nearby_obj` CTE (3км-множество считается один раз) → `obj_pricing` scoped через `WHERE cm.domrf_obj_id IN (SELECT obj_id FROM nearby_obj)` → финальный SELECT `FROM nearby_obj` (scope == потребляемое множество структурно). Планировщик: **bitmap index scan вместо full parallel seq scan**. | | OLD | NEW | |---|---|---| | objective_lots access | Parallel Seq Scan 374590×3 | Bitmap Index Scan 2052×43 | | buffer reads | 212658 (~1.66ГБ) | 20561 (**~10×**) | | exec (warm ×3) | 643/726/708мс | **278/281/304мс** | ## Корректность **Байт-идентично** (proven на проде): per-obj_id агрегат независим от других групп → scoping убирает только лишнюю работу. Diff OLD vs NEW на 43 ближних группах: **0 расхождений** по всем 5 колонкам. Цена/fallback (#1332) не тронуты — scope-only. ## Test plan - [x] EXPLAIN до/после на проде (центр ЕКБ centroid) - [x] byte-identity diff 43 группы → 0 mismatch - [x] 3 regression-теста (pushdown predicate / FROM nearby_obj / агрегация intact) + negative control; 24 passed; ruff clean - [x] code-reviewer (см. ниже) - [ ] post-deploy: analyze competitor block latency Refs #70
bot-backend added 1 commit 2026-06-14 16:49:23 +00:00
perf(site-finder): pushdown obj_pricing CTE to nearby competitors in analyze (#70, #307)
All checks were successful
CI / frontend-tests (pull_request) Has been skipped
CI / changes (push) Successful in 7s
CI / frontend-tests (push) Has been skipped
CI / changes (pull_request) Successful in 7s
CI / openapi-codegen-check (push) Successful in 1m57s
CI / openapi-codegen-check (pull_request) Successful in 1m50s
CI / backend-tests (push) Successful in 8m53s
CI / backend-tests (pull_request) Successful in 8m51s
af5e730438
obj_pricing (OBJ-3 #1332) агрегировал objective_lots (2.1ГБ) по всем ~286
маппингам через GROUP BY domrf_obj_id, но LEFT JOIN потреблял только ~43
ближних (3км) obj_id — далёкие медианы считались и выбрасывались.

Добавлен nearby_obj CTE (3км-множество считается раз), obj_pricing scoped
через WHERE cm.domrf_obj_id IN (SELECT obj_id FROM nearby_obj), финальный
SELECT идёт FROM nearby_obj → scope == потребляемое множество. Планировщик
теперь bitmap index scan вместо full parallel seq scan.

Прод EXPLAIN (центр ЕКБ): ~700мс→~290мс, objective_lots buffer reads
212658→20561 (~10x). Байт-идентично: per-obj_id агрегаты независимы,
0 расхождений на 43 ближних группах. Цена/fallback не тронуты (scope-only).
Регрешн-гард против отката к full-table агрегации.

Refs #70
bot-backend merged commit cab19020a9 into main 2026-06-14 16:58:44 +00:00
bot-backend deleted branch perf/obj-pricing-pushdown 2026-06-14 16:58:44 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1335
No description provided.