Changes between Version 2 and Version 3 of QueryOptimization


Ignore:
Timestamp:
06/12/26 20:32:44 (9 days ago)
Author:
231138
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v2 v3  
    1919==== Време на извршување без индекси:
    2020
    21 **72 s 559 ms**
     21**2 m 9 s 602 ms**
    2222
    2323{{{
     
    2525                       (actual time=178.534..72559.294 rows=547.00 loops=1)
    2626  ->  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)
    2828        Workers Planned: 2
    2929        Workers Launched: 2
     
    5959==== Време на извршување со индекси:
    6060
    61 **3 s 980 ms** (беше 72 s 559 ms)
     61**1 s 103 ms** (беше 2 m 9 s 602 ms)
    6262
    6363{{{
     
    8181}}}
    8282
    83 `idx_rides_status_dep` го заменува целосниот скен на `rides` со `Bitmap Index Scan` — планерот директно ги наоѓа редовите со `status = 'scheduled'`. `idx_ratings_reviewee` го заменува `Seq Scan on ratings` со `Bitmap Index Scan` по `reviewee_user_id` за секој возач поединечно. Вкупното подобрување е ~18x (од 72.5 s на 3.98 s).
     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).
    8484
    8585=== 2. Анализа на поглед 2, профил на возач ===
     
    9292==== Време на извршување без индекси:
    9393
    94 **1 s 239 ms**
     94**1 s 388 ms**
    9595
    9696{{{
     
    136136==== Време на извршување со индекси:
    137137
    138 **1 s 379 ms** (беше 1 s 239 ms)
     138**743 ms** (беше 1 s 388 ms)
    139139
    140140{{{
     
    164164}}}
    165165
    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).
    167167
    168168=== 3. Анализа на поглед 3, заработка на возач ===
     
    175175==== Време на извршување без индекси:
    176176
    177 **33 s 186 ms**
     177**18 s 138 ms**
    178178
    179179{{{
     
    208208==== Нема индекси — агрегатен поглед:
    209209
    210 Времето на извршување останува **~33 s** — индексите не влијаат на перформансите на агрегатни погледи кои мора да ги прочитаат сите редови.
     210Времето на извршување останува **~18 s** — индексите не влијаат на перформансите на агрегатни погледи кои мора да ги прочитаат сите редови.
    211211
    212212=== 4. Анализа на поглед 4, историја на патувања на патник ===
     
    219219==== Време на извршување без индекси:
    220220
    221 **721 ms**
     221**1 s 990 ms**
    222222
    223223{{{
     
    243243}}}
    244244
    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`. Ги додаваме следните индекси:
    246246
    247247{{{
     
    258258==== Време на извршување со индекси:
    259259
    260 **562 ms** (беше 721 ms)
     260**562 ms** (беше 1 s 990 ms)
    261261
    262262{{{
     
    279279}}}
    280280
    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).
    282282
    283283=== 5. Анализа на поглед 5, манифест на возење ===
     
    357357==== Време на извршување без индекси:
    358358
    359 **77 s 785 ms**
     359**33 s 268 ms**
    360360
    361361{{{
     
    406406==== Време на извршување со материјализиран поглед:
    407407
    408 **8–10 ms** (беше 77 s 785 ms)
    409 
    410 Материјализираниот поглед ги зачувува резултатите физички на диск. Освежувањето трае ~43 s, но секое читање после тоа е практично моментално преку индексите.
     408**18 ms** (беше 33 s 268 ms)
     409
     410Материјализираниот поглед ги зачувува резултатите физички на диск. Освежувањето трае ~43 s (еднократно), но секое читање после тоа е практично моментално преку индексите. Подобрувањето е ~1850x.
    411411
    412412=== 7. Анализа на поглед 7, детали за резервација ===
     
    419419==== Време на извршување без индекси:
    420420
    421 **2 ms 116 ms**
     421**11 ms**
    422422
    423423{{{
     
    453453==== Нема индекси — веќе оптимален:
    454454
    455 Времето на извршување останува **~2 ms** — погледот работи оптимално преку постоечките примарни клучеви.
     455Времето на извршување останува **~11 ms** — погледот работи оптимално преку постоечките примарни клучеви.
    456456
    457457=== 8. Анализа на поглед 8, резиме на инциденти ===
     
    464464==== Време на извршување без индекси:
    465465
    466 **17 ms 335 ms**
     466**13 ms**
    467467
    468468{{{
     
    489489}}}
    490490
    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` беа отстранети.
    492492
    493493==== Време на извршување со индекс:
    494494
    495 **46 ms 095 ms** (без подобрување — индексот отстранет)
     495**19 ms** (без подобрување — индексите отстранети)
    496496
    497497{{{
     
    511511}}}
    512512
    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` е поефикасен. Индексите беа отстранети.
    514514
    515515=== 9. Анализа на поглед 9, непрочитани нотификации ===
     
    522522==== Време на извршување без индекси:
    523523
    524 **2 s 410 ms**
     524**3 s 304 ms**
    525525
    526526{{{
     
    550550==== Време на извршување со индекс:
    551551
    552 **40 ms 896 ms** (беше 2 s 410 ms)
     552**22 ms** (беше 3 s 304 ms)
    553553
    554554{{{
     
    564564}}}
    565565
    566 `idx_notif_user_unread` е парцијален индекс — ги индексира само непрочитаните нотификации (`WHERE read_at IS NULL`), со што е и мал и брз. Планерот го заменува `Parallel Seq Scan` со директен `Index Scan`. Подобрувањето е ~59x (од 2.41 s на 40 ms).
     566`idx_notif_user_unread` е парцијален индекс — ги индексира само непрочитаните нотификации (`WHERE read_at IS NULL`), со што е и мал и брз. Планерот го заменува `Parallel Seq Scan` со директен `Index Scan`. Подобрувањето е ~150x (од 3 s 304 ms на 22 ms).
    567567
    568568=== Резиме на индекси ===
     
    571571
    572572|| **Индекс** || **Табела** || **Поглед** || **Пред** || **По** ||
    573 || `idx_rides_status_dep` || rides || v_available_rides || 72 s 559 ms || 3 s 980 ms ||
     573|| `idx_rides_status_dep` || rides || v_available_rides || 2 m 9 s || 1 s 103 ms ||
    574574|| `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 379 ms ||
    576 || `idx_bookings_passenger_id` || bookings || v_passenger_trip_history || 721 ms || 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 ||
    577577|| `idx_passengers_user_id` || passengers || v_passenger_trip_history || значајно || значајно ||
    578578|| `idx_ratings_reviewer_ride` || ratings || v_passenger_trip_history || значајно || значајно ||
    579579|| `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 || 40 ms ||
    581 || `mv_route_popularity` || — || v_route_popularity || 77 s 785 ms || 8–10 ms ||
     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 ||
    582582
    583583Отстранети индекси (без ефект или со негативно влијание):