Files
orderPRO/.paul/phases/07-pre-expansion-fixes/07-01-SUMMARY.md
2026-03-14 01:10:29 +01:00

123 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
phase: 07-pre-expansion-fixes
plan: 01
subsystem: database
tags: [performance, n+1, sql-optimization, indexes, static-cache]
requires:
- phase: 06-sonarqube-quality
provides: OrdersRepository refactored (god class split)
provides:
- Aggregating LEFT JOINs replacing N+1 correlated subqueries in orders list
- Static cache for information_schema check
- Performance indexes on orders table
affects: [07-02, 07-03, 07-04]
tech-stack:
added: []
patterns: [aggregating-left-join, static-property-cache]
key-files:
created:
- database/migrations/20260314_000048_add_orders_performance_indexes.sql
modified:
- src/Modules/Orders/OrdersRepository.php
key-decisions:
- "allegro_order_status_mappings index skipped — already has UNIQUE KEY on allegro_status_code"
- "Migration date 20260314 (execution date, not plan date)"
patterns-established:
- "Aggregating LEFT JOIN zamiast correlated subqueries dla countów/sum w listach"
- "Static property cache dla information_schema lookups"
duration: ~8min
started: 2026-03-14
completed: 2026-03-14
---
# Phase 7 Plan 01: Performance Fixes Summary
**Eliminacja N+1 subqueries w liście zamówień, static cache dla information_schema, indeksy wydajnościowe na tabeli orders**
## Performance
| Metric | Value |
|--------|-------|
| Duration | ~8min |
| Started | 2026-03-14 |
| Completed | 2026-03-14 |
| Tasks | 3 completed |
| Files modified | 2 (1 modified, 1 created) |
## Acceptance Criteria Results
| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Brak correlated subqueries w liście zamówień | Pass | 4 subqueries zastąpione aggregating LEFT JOINs; grep potwierdza zero `SELECT COUNT(*) FROM order_items WHERE oi.order_id` |
| AC-2: information_schema nie odpytywany per-request | Pass | `private static ?bool $supportsMappedMedia` + `self::$supportsMappedMedia` — max 1× na cykl PHP |
| AC-3: Brakujące indeksy dodane migracją | Pass | Migracja 000048: source, external_status_id, ordered_at, composite (source, external_status_id); IF NOT EXISTS |
## Accomplishments
- 4 correlated subqueries (items_count, items_qty, shipments_count, documents_count) → 3 aggregating LEFT JOINs — eliminacja ~200 dodatkowych zapytań przy 50 wierszach na stronę
- `canResolveMappedMedia()` z instance na static property — information_schema odpytywany max 1× na cykl PHP
- 4 brakujące indeksy na tabeli orders dla typowych filtrów/sortowań
## Files Created/Modified
| File | Change | Purpose |
|------|--------|---------|
| `src/Modules/Orders/OrdersRepository.php` | Modified | LEFT JOINs zamiast subqueries w buildListSql(); static cache w canResolveMappedMedia() |
| `database/migrations/20260314_000048_add_orders_performance_indexes.sql` | Created | Indeksy: source, external_status_id, ordered_at, composite (source, external_status_id) |
| `DOCS/DB_SCHEMA.md` | Modified | Wpis o migracji 000048 |
| `DOCS/TECH_CHANGELOG.md` | Modified | Wpis 2026-03-14 o optymalizacjach |
## Decisions Made
| Decision | Rationale | Impact |
|----------|-----------|--------|
| Pominięto indeks na allegro_order_status_mappings.allegro_status_code | Tabela już ma UNIQUE KEY na tej kolumnie (migracja 000025) | Brak duplikatu indeksu |
| Data migracji 20260314 zamiast 20260313 | Wykonanie w dniu 2026-03-14 | Numeracja zgodna z datą faktycznego utworzenia |
## Deviations from Plan
### Summary
| Type | Count | Impact |
|------|-------|--------|
| Auto-fixed | 0 | - |
| Scope additions | 0 | - |
| Deferred | 0 | - |
**Total impact:** Plan wykonany zgodnie ze specyfikacją. Jedyna różnica: pominięcie zbędnego indeksu na allegro_order_status_mappings (UNIQUE KEY już istniał).
## Issues Encountered
None
## Verification Results
```
✓ php -l src/Modules/Orders/OrdersRepository.php — No syntax errors
✓ grep correlated subqueries — 0 matches (eliminated)
✓ grep supportsMappedMedia — static + self:: confirmed
✓ Migration 000048 — exists, non-empty, idempotent (IF NOT EXISTS)
```
## Next Phase Readiness
**Ready:**
- OrdersRepository zoptymalizowany — lista zamówień gotowa na wzrost danych
- Plan 07-02 (SSL + cron + migration) niezależny, może być wykonany natychmiast
**Concerns:**
- Migracja 000048 wymaga uruchomienia na środowisku docelowym
**Blockers:**
- None
---
*Phase: 07-pre-expansion-fixes, Plan: 01*
*Completed: 2026-03-14*