Skip to content

perf(db): „Свързани лица“ и самоличността на лицето четат по индекс, не цели таблици - #407

Merged
todorkolev merged 1 commit into
mainfrom
perf/person-and-conflicts-queries
Oct 1, 2026
Merged

todorkolev merged 1 commit into
mainfrom
perf/person-and-conflicts-queries

Conversation

@todorkolev

Copy link
Copy Markdown
Collaborator

Какво и защо

Няколко заявки на страниците за лица и на списъка „Свързани лица“ четяха
цели таблици при всяко некеширано показване:

  • Списъкът събираше годините на длъжност от всички декларации, а
    дружествата и длъжностите на всеки ред — с подзаявка, която четеше целия
    списък на връзките наново за всеки човек. Сега годините се четат само за
    хората в списъка, а дружествата и длъжностите се събират веднъж на лице.
  • Списъкът с роли от регистъра обхождаше всички дружества с договори и
    преглеждаше материализирания списък на годините за всеки договор. Сега
    чете от хората към ролите им, а годината проверява по индекса на
    декларациите.
  • Пренасочванията и имената, под които лицето е подавало декларации,
    минаваха през индекса на пространството от имена, т.е. през всички
    източници; сега стигат до своите редове по ключа.
  • Миграция 0023 добавя индекси interest_links(eik, status),
    (person_id, status), (bidder_id, status) и
    interest_link_observations(timing, reported_year); деплоят я прилага по
    име, а публикуването на декларациите ги пресъздава на всяко ново
    поколение.

На dev, прочетени редове на заявка (main → клона), при еднакъв резултат:
списъкът без филтър 665 хил. → 120 хил., за една институция 315–331 хил.
→ 9–25 хил.; ролите от регистъра 1,45 млн. → 50 хил., за институция
136–185 хил. → 15–31 хил.; пренасочванията 27,6 млн. → 254 хил. за 150
псевдонима; имената 7,3 млн. → 376 хил. за 40 профила; дейността на лице
само от регистъра 56–328 хил. → 0,6–3,8 хил., на тежък профил 744 хил. →
50 хил.; доставчиците на голяма институция 49–60 хил. → 0,9–1,5 хил.;
връзките на лице и на фирма с около една трета по-малко.

Свързан issue

Няма отделен issue — част от серията поправки по тръбопроводите на dev/stage и цената на D1.

Как е тествано

  • Целият локален набор в реда на CI (gitleaks, OSV-Scanner, pnpm lint, pnpm typecheck, pnpm test -- --coverage, pnpm check:coverage, pnpm check:fake-d1, pnpm check:docs, script и CACBG/ТР тестове) — зелен за клона поотделно и за цялата серия от 12 заедно върху main.
  • Проверено на живо на dev преди серията.

Чеклист

  • Комитите следват conventional commits и нямат Co-Authored-By: trailer, който сочи към агент
  • PR-ът е с един логически обхват и е към midt-bg/sigma:main от вътрешен maintainer branch
  • pnpm typecheck, pnpm test и pnpm lint минават
  • Няма комитнати тайни, .env* или .dev.vars
  • Няма реален човек или назована организация като пример (AGENTS.md)

🤖 Generated with Claude Code

https://claude.ai/code/session_013pBk7JaPgpsgELYGZgnkwt

…не цели таблици

Няколко заявки на страниците за лица и на списъка „Свързани лица“ четяха
цели таблици при всяко некеширано показване:

- Списъкът събираше годините на длъжност от всички декларации, а
  дружествата и длъжностите на всеки ред — с подзаявка, която четеше целия
  списък на връзките наново за всеки човек. Сега годините се четат само за
  хората в списъка, а дружествата и длъжностите се събират веднъж на лице.
- Списъкът с роли от регистъра обхождаше всички дружества с договори и
  преглеждаше материализирания списък на годините за всеки договор. Сега
  чете от хората към ролите им, а годината проверява по индекса на
  декларациите.
- Пренасочванията и имената, под които лицето е подавало декларации,
  минаваха през индекса на пространството от имена, т.е. през всички
  източници; сега стигат до своите редове по ключа.
- Миграция 0023 добавя индекси interest_links(eik, status),
  (person_id, status), (bidder_id, status) и
  interest_link_observations(timing, reported_year); деплоят я прилага по
  име, а публикуването на декларациите ги пресъздава на всяко ново
  поколение.

На dev, прочетени редове на заявка (main → клона), при еднакъв резултат:
списъкът без филтър 665 хил. → 120 хил., за една институция 315–331 хил.
→ 9–25 хил.; ролите от регистъра 1,45 млн. → 50 хил., за институция
136–185 хил. → 15–31 хил.; пренасочванията 27,6 млн. → 254 хил. за 150
псевдонима; имената 7,3 млн. → 376 хил. за 40 профила; дейността на лице
само от регистъра 56–328 хил. → 0,6–3,8 хил., на тежък профил 744 хил. →
50 хил.; доставчиците на голяма институция 49–60 хил. → 0,9–1,5 хил.;
връзките на лице и на фирма с около една трета по-малко.
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown

Test coverage

Workspace Lines Δ Branches Δ Functions Statements
apps/etl 99.54% +0.54pp 97.95% +0.35pp 98.61% 99.60%
apps/web 99.10% -0.30pp 96.28% +0.28pp 97.78% 99.04%
packages/config 100.00% +1.00pp 100.00% +0.00pp 100.00% 100.00%
packages/db 99.94% +0.94pp 98.14% -0.16pp 99.78% 99.60%
packages/ingest 100.00% +1.00pp 99.16% +0.46pp 99.35% 99.44%
packages/shared 99.38% +0.58pp 98.04% -0.26pp 98.11% 98.61%
packages/test-support 100.00% +1.00pp 100.00% +0.00pp 100.00% 100.00%
Total (informational) 99.56% — 97.46% — 98.67% 99.34%

✅ No workspace dropped below its baseline (tolerance 0.5pp).

@todorkolev
todorkolev merged commit 23355c3 into main Oct 1, 2026
5 checks passed
@todorkolev
todorkolev deleted the perf/person-and-conflicts-queries branch October 1, 2026 21:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant