Changes between Version 4 and Version 5 of QueryOptimization


Ignore:
Timestamp:
05/26/26 22:15:13 (16 hours ago)
Author:
231088
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v4 v5  
    225225
    226226Со додавањето на индексите planner-от започна да користи индексно пребарување наместо {{{Parallel Sequential Scan}}}, што овозможи значително побрзо извршување на query-ите и подобар execution plan.
     227
     228
     229== 3. Анализа и оптимизација на vw_public_artist_profiles ==
     230
     231Погледот {{{vw_public_artist_profiles}}} се користи за прикажување на јавните профили на артистите и бендовите, нивниот град, жанр, просечен рејтинг и бројот на reviews.
     232
     233Прашалникот кој беше тестиран е следниот:
     234
     235{{{
     236SELECT *
     237FROM vw_public_artist_profiles
     238WHERE city = 'Skopje';
     239}}}
     240
     241=== Време на извршување без индекси ===
     242
     243'''3.1 - 15423.388 ms'''
     244
     245{{{
     246HashAggregate  (cost=761290.87..761380.87 rows=6000 width=497) (actual time=15419.314..15419.430 rows=213 loops=1)
     247  Group Key: b.bookable_id, g.genre_name
     248  ->  Hash Left Join
     249        ->  Hash Left Join
     250              ->  Hash Right Join
     251                    ->  Seq Scan on booking bk
     252                    ->  Seq Scan on offer o
     253              ->  Seq Scan on review r
     254Planning Time: 1.979 ms
     255Execution Time: 15423.388 ms
     256}}}
     257
     258При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} врз табелите {{{Offer}}}, {{{Booking}}} и {{{Review}}}, како и голем број {{{Hash Join}}} операции.
     259
     260Поради огромниот број редици и aggregation операции, query-от имаше долго време на извршување.
     261
     262За оптимизација беа додадени следните индекси:
     263
     264{{{
     265CREATE INDEX idx_bookable_location
     266ON Bookable(location_id);
     267
     268CREATE INDEX idx_location_city
     269ON Location(city);
     270
     271CREATE INDEX idx_review_booking
     272ON Review(booking_id);
     273
     274CREATE INDEX idx_offer_bookable
     275ON Offer(bookable_id);
     276
     277CREATE INDEX idx_booking_offer
     278ON Booking(offer_id);
     279
     280CREATE INDEX idx_bookable_rating
     281ON Bookable(average_rating);
     282}}}
     283
     284=== Време на извршување со индекси ===
     285
     286'''3.1 - 15251.957 ms'''
     287
     288{{{
     289HashAggregate  (cost=761290.87..761380.87 rows=6000 width=497) (actual time=15247.945..15248.063 rows=213 loops=1)
     290  Group Key: b.bookable_id, g.genre_name
     291  ->  Hash Left Join
     292        ->  Hash Left Join
     293              ->  Hash Right Join
     294                    ->  Seq Scan on booking bk
     295                    ->  Seq Scan on offer o
     296              ->  Seq Scan on review r
     297Planning Time: 1.898 ms
     298Execution Time: 15251.957 ms
     299}}}
     300
     301По оптимизацијата беше забележано умерено подобрување:
     302
     303 * од ~15.4 s
     304 * на ~15.2 s
     305
     306И покрај додадените индекси, PostgreSQL продолжи да користи {{{Sequential Scan}}} бидејќи query-от обработува огромен број редици и користи сложени aggregation операции како {{{AVG}}}, {{{COUNT}}} и {{{GROUP BY}}}.
     307
     308Во вакви ситуации planner-от проценува дека sequential processing е поефикасен од index traversal, па индексите имаат ограничено влијание врз вкупното време на извршување.