271 | | **Структура на планот** |
272 | | |
273 | | - Користи CTE playcounts → !HashAggregate → Hash Join (track → genre) → Nested Loops за invoice → invoice_line → track → album → artist. |
274 | | |
275 | | - Потоа се пресметува Max Play Counts и се join-ира со playcounts. |
276 | | |
277 | | - Финално се враќаат редовите. |
278 | | |
279 | | - Физичките операции се исти во двата плана. |
280 | | |
281 | | || **Клучни метрики** || **Прв план** || **Втор план** || |
282 | | || Hash Join (финален) || 0.254–0.258 ms || 0.249–0.254 ms || |
283 | | || Време на извршување || 0.372 ms || 0.345 ms || |
284 | | || Време на планирање || 3.223 ms || 0.858 ms || |
285 | | || Buffers (shared hit) || 223 || 223 || |
286 | | || Врати редови || 8 || 8 || |
287 | | |
288 | | |
289 | | **Заклучок**: Извршувањето е малку побрзо кај вториот план, а најголема разлика е во времето за планирање. Бидејќи станува збор за помала база на податоци разликата на извршувањето не е значајна, меѓуто времето на планирање е намалено на 1/4 од она без индекси. |
| 271 | === Прв план === |
| 272 | * Hash Join (финален): 1.019..1.028 ms |
| 273 | * Execution Time: 1.194 ms |
| 274 | * Planning Time: 4.045 ms |
| 275 | * Buffers: shared hit=231 |
| 276 | * Клучни чекори: |
| 277 | - Seq Scan на invoice (филтер customer_id=5) → чита 399 редови, само 7 погодени. |
| 278 | - Seq Scan на invoice_line (2221 редови). |
| 279 | - Nested Loop + Hash Join со artist, album, track. |
| 280 | - Повеќе seq scans → поголема потрошувачка на buffers и време. |
| 281 | |
| 282 | === Втор план === |
| 283 | * Hash Join (финален): 0.316..0.321 ms |
| 284 | * Execution Time: 0.431 ms |
| 285 | * Planning Time: 0.894 ms |
| 286 | * Buffers: shared hit=223 |
| 287 | * Клучни чекори: |
| 288 | - Bitmap Index Scan на invoice (idx_invoice_customer_id) → директно таргетира 7 редови. |
| 289 | - Bitmap Heap Scan + Index Scan на invoice_line. |
| 290 | - Index Scan на track и album. |
| 291 | - Помалку време и buffers со индексирани пристапи. |
| 292 | |
| 293 | === Споредбена табела === |
| 294 | || Метрика || Прв план || Втор план || |
| 295 | | Hash Join (финален) | ~1.02 ms | ~0.32 ms | |
| 296 | | Execution Time | 1.194 ms | 0.431 ms | |
| 297 | | Planning Time | 4.045 ms | 0.894 ms | |
| 298 | | Buffers (shared hit) | 231 | 223 | |
| 299 | | Редови вратени | 8 | 8 | |
| 300 | |
| 301 | === Заклучок === |
| 302 | * Вториот план е поефикасен. |
| 303 | * Користи индекси (Bitmap Index Scan, Index Scan) наместо full Seq Scan. |
| 304 | * Резултат: ~3x побрзо извршување, ~4x побрзо планирање, помало buffer користење. |