Changes between Version 2 and Version 3 of QueryOptimization
- Timestamp:
- 06/12/26 20:32:44 (9 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
QueryOptimization
v2 v3 19 19 ==== Време на извршување без индекси: 20 20 21 ** 72 s 559ms**21 **2 m 9 s 602 ms** 22 22 23 23 {{{ … … 25 25 (actual time=178.534..72559.294 rows=547.00 loops=1) 26 26 -> Gather (cost=1023.28..89235.80 rows=9 width=767) 27 (actual time=1.669..2.593 rows=547.00 loops= 3)27 (actual time=1.669..2.593 rows=547.00 loops=1) 28 28 Workers Planned: 2 29 29 Workers Launched: 2 … … 59 59 ==== Време на извршување со индекси: 60 60 61 ** 3 s 980 ms** (беше 72 s 559ms)61 **1 s 103 ms** (беше 2 m 9 s 602 ms) 62 62 63 63 {{{ … … 81 81 }}} 82 82 83 `idx_rides_status_dep` го заменува целосниот скен на `rides` со `Bitmap Index Scan` — планерот директно ги наоѓа редовите со `status = 'scheduled'`. `idx_ratings_reviewee` го заменува `Seq Scan on ratings` со `Bitmap Index Scan` по `reviewee_user_id` за секој возач поединечно. Вкупното подобрување е ~1 8x (од 72.5 s на 3.98s).83 `idx_rides_status_dep` го заменува целосниот скен на `rides` со `Bitmap Index Scan` — планерот директно ги наоѓа редовите со `status = 'scheduled'`. `idx_ratings_reviewee` го заменува `Seq Scan on ratings` со `Bitmap Index Scan` по `reviewee_user_id` за секој возач поединечно. Вкупното подобрување е ~118x (од 2 m 9 s на 1 s 103 ms). 84 84 85 85 === 2. Анализа на поглед 2, профил на возач === … … 92 92 ==== Време на извршување без индекси: 93 93 94 **1 s 239ms**94 **1 s 388 ms** 95 95 96 96 {{{ … … 136 136 ==== Време на извршување со индекси: 137 137 138 ** 1 s 379 ms** (беше 1 s 239ms)138 **743 ms** (беше 1 s 388 ms) 139 139 140 140 {{{ … … 164 164 }}} 165 165 166 `idx_vo_driver_active` е искористен преку `Index Only Scan` за брзо наоѓање на активното возило без пристап до хип. Агрегацијата на `ratings` сепак бара целосен скен бидејќи погледот ги агрегира оцените за сите возачи — ова е агрегација врз цело множество каде индексот не може да ја елиминира потребата за читање на сите редови. `Parallel Seq Scan on rides` исто така останува бидејќи нема индекс по `driver_id` на `rides` (`idx_rides_driver_status` беше отстранет). Подобрувањето е минимално поради доминантната агрегација на `ratings`.166 `idx_vo_driver_active` е искористен преку `Index Only Scan` за брзо наоѓање на активното возило без пристап до хип. Агрегацијата на `ratings` сепак бара целосен скен бидејќи погледот ги агрегира оцените за сите возачи. `Parallel Seq Scan on rides` исто така останува бидејќи `idx_rides_driver_status` беше отстранет. Вкупното подобрување е ~2x (од 1 s 388 ms на 743 ms). 167 167 168 168 === 3. Анализа на поглед 3, заработка на возач === … … 175 175 ==== Време на извршување без индекси: 176 176 177 ** 33 s 186ms**177 **18 s 138 ms** 178 178 179 179 {{{ … … 208 208 ==== Нема индекси — агрегатен поглед: 209 209 210 Времето на извршување останува **~ 33s** — индексите не влијаат на перформансите на агрегатни погледи кои мора да ги прочитаат сите редови.210 Времето на извршување останува **~18 s** — индексите не влијаат на перформансите на агрегатни погледи кои мора да ги прочитаат сите редови. 211 211 212 212 === 4. Анализа на поглед 4, историја на патувања на патник === … … 219 219 ==== Време на извршување без индекси: 220 220 221 ** 721ms**221 **1 s 990 ms** 222 222 223 223 {{{ … … 243 243 }}} 244 244 245 Најбавната операција е `Parallel Seq Scan on bookings` — без индекс базата скенира сите 12,000,000 резервации за секое барање на патник. Иако `passengers_user_id_key` веќе постои (уникатен индекс), нема индекс по `bookings.passenger_id`. Ги додаваме следните индекси:245 Најбавната операција е `Parallel Seq Scan on bookings` — без индекс базата скенира сите 12,000,000 резервации за секое барање на патник. Иако `passengers_user_id_key` веќе постои, нема индекс по `bookings.passenger_id`. Ги додаваме следните индекси: 246 246 247 247 {{{ … … 258 258 ==== Време на извршување со индекси: 259 259 260 **562 ms** (беше 721ms)260 **562 ms** (беше 1 s 990 ms) 261 261 262 262 {{{ … … 279 279 }}} 280 280 281 `idx_bookings_passenger_id` го елиминира целосниот скен на 12 милиони резервации — планерот директно ги наоѓа резервациите на патникот преку `Bitmap Index Scan`. `idx_ratings_reviewer_ride` го решава JOIN за оцените преку еден пристап по индекс наместо скен. 281 `idx_bookings_passenger_id` го елиминира целосниот скен на 12 милиони резервации — планерот директно ги наоѓа резервациите на патникот преку `Bitmap Index Scan`. `idx_ratings_reviewer_ride` го решава JOIN за оцените преку еден пристап по индекс наместо скен. Вкупното подобрување е ~3.5x (од 1 s 990 ms на 562 ms). 282 282 283 283 === 5. Анализа на поглед 5, манифест на возење === … … 357 357 ==== Време на извршување без индекси: 358 358 359 ** 77 s 785ms**359 **33 s 268 ms** 360 360 361 361 {{{ … … 406 406 ==== Време на извршување со материјализиран поглед: 407 407 408 ** 8–10 ms** (беше 77 s 785ms)409 410 Материјализираниот поглед ги зачувува резултатите физички на диск. Освежувањето трае ~43 s , но секое читање после тоа е практично моментално преку индексите.408 **18 ms** (беше 33 s 268 ms) 409 410 Материјализираниот поглед ги зачувува резултатите физички на диск. Освежувањето трае ~43 s (еднократно), но секое читање после тоа е практично моментално преку индексите. Подобрувањето е ~1850x. 411 411 412 412 === 7. Анализа на поглед 7, детали за резервација === … … 419 419 ==== Време на извршување без индекси: 420 420 421 ** 2 ms 116ms**421 **11 ms** 422 422 423 423 {{{ … … 453 453 ==== Нема индекси — веќе оптимален: 454 454 455 Времето на извршување останува **~ 2ms** — погледот работи оптимално преку постоечките примарни клучеви.455 Времето на извршување останува **~11 ms** — погледот работи оптимално преку постоечките примарни клучеви. 456 456 457 457 === 8. Анализа на поглед 8, резиме на инциденти === … … 464 464 ==== Време на извршување без индекси: 465 465 466 **1 7 ms 335ms**466 **13 ms** 467 467 468 468 {{{ … … 489 489 }}} 490 490 491 `Seq Scan on incident_reports` скенира 49,996 редови со `Filter: ride_id = 216`. Иако беше тестиран `idx_incident_ride_id`, планерот не го користеше бидејќи табелата е релативно мала и `Seq Scan` е побрз за мали табели. Индексот беше отстранет.491 `Seq Scan on incident_reports` скенира 49,996 редови со `Filter: ride_id = 216`. Иако беше тестиран `idx_incident_ride_id`, планерот не го користеше бидејќи табелата е релативно мала и `Seq Scan` е побрз. Индексите `idx_incident_ride_id`, `idx_incident_type` и `idx_incident_reported_at` беа отстранети. 492 492 493 493 ==== Време на извршување со индекс: 494 494 495 ** 46 ms 095 ms** (без подобрување — индексот отстранет)495 **19 ms** (без подобрување — индексите отстранети) 496 496 497 497 {{{ … … 511 511 }}} 512 512 513 Планерот продолжува да користи `Seq Scan on incident_reports` дури и со индекс — за 49,996 редови `Seq Scan` е поефикасен. Индексите `idx_incident_ride_id`, `idx_incident_type` и `idx_incident_reported_at`беа отстранети.513 Планерот продолжува да користи `Seq Scan on incident_reports` дури и со индекс — за 49,996 редови `Seq Scan` е поефикасен. Индексите беа отстранети. 514 514 515 515 === 9. Анализа на поглед 9, непрочитани нотификации === … … 522 522 ==== Време на извршување без индекси: 523 523 524 ** 2 s 410ms**524 **3 s 304 ms** 525 525 526 526 {{{ … … 550 550 ==== Време на извршување со индекс: 551 551 552 ** 40 ms 896 ms** (беше 2 s 410ms)552 **22 ms** (беше 3 s 304 ms) 553 553 554 554 {{{ … … 564 564 }}} 565 565 566 `idx_notif_user_unread` е парцијален индекс — ги индексира само непрочитаните нотификации (`WHERE read_at IS NULL`), со што е и мал и брз. Планерот го заменува `Parallel Seq Scan` со директен `Index Scan`. Подобрувањето е ~ 59x (од 2.41 s на 40ms).566 `idx_notif_user_unread` е парцијален индекс — ги индексира само непрочитаните нотификации (`WHERE read_at IS NULL`), со што е и мал и брз. Планерот го заменува `Parallel Seq Scan` со директен `Index Scan`. Подобрувањето е ~150x (од 3 s 304 ms на 22 ms). 567 567 568 568 === Резиме на индекси === … … 571 571 572 572 || **Индекс** || **Табела** || **Поглед** || **Пред** || **По** || 573 || `idx_rides_status_dep` || rides || v_available_rides || 72 s 559 ms || 3 s 980ms ||573 || `idx_rides_status_dep` || rides || v_available_rides || 2 m 9 s || 1 s 103 ms || 574 574 || `idx_ratings_reviewee` || ratings || v_available_rides, v_driver_profile || значајно || значајно || 575 || `idx_vo_driver_active` || vehicle_ownership || v_driver_profile || 1 s 239 ms || 1 s 379ms ||576 || `idx_bookings_passenger_id` || bookings || v_passenger_trip_history || 721ms || 562 ms ||575 || `idx_vo_driver_active` || vehicle_ownership || v_driver_profile || 1 s 388 ms || 743 ms || 576 || `idx_bookings_passenger_id` || bookings || v_passenger_trip_history || 1 s 990 ms || 562 ms || 577 577 || `idx_passengers_user_id` || passengers || v_passenger_trip_history || значајно || значајно || 578 578 || `idx_ratings_reviewer_ride` || ratings || v_passenger_trip_history || значајно || значајно || 579 579 || `idx_bookings_ride_status` || bookings || v_ride_manifest || 2 ms || 2 ms || 580 || `idx_notif_user_unread` || notifications || v_unread_notifications || 2 s 410 ms || 40ms ||581 || `mv_route_popularity` || — || v_route_popularity || 77 s 785 ms || 8–10ms ||580 || `idx_notif_user_unread` || notifications || v_unread_notifications || 3 s 304 ms || 22 ms || 581 || `mv_route_popularity` || — || v_route_popularity || 33 s 268 ms || 18 ms || 582 582 583 583 Отстранети индекси (без ефект или со негативно влијание):
