Changes between Version 15 and Version 16 of QueryOptimization


Ignore:
Timestamp:
05/26/26 23:26:53 (15 hours ago)
Author:
231088
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v15 v16  
    228228
    229229== 3. Анализа и оптимизација на vw_public_artist_profiles ==
    230 
    231230Погледот {{{vw_public_artist_profiles}}} се користи за прикажување на јавните профили на артистите и бендовите, нивниот град, жанр, просечен рејтинг и бројот на reviews.
    232231
    233232Прашалникот кој беше тестиран е следниот:
    234 
    235233{{{
    236234SELECT *
     
    240238
    241239=== Време на извршување без индекси ===
    242 
    243240'''3.1 - 15423.388 ms'''
    244 
    245241{{{
    246242HashAggregate  (cost=761290.87..761380.87 rows=6000 width=497) (actual time=15419.314..15419.430 rows=213 loops=1)
     
    261257
    262258За оптимизација беа додадени следните индекси:
    263 
    264259{{{
    265260CREATE INDEX idx_bookable_location
     
    283278
    284279=== Време на извршување со индекси ===
    285 
    286280'''3.1 - 15251.957 ms'''
    287 
    288281{{{
    289282HashAggregate  (cost=761290.87..761380.87 rows=6000 width=497) (actual time=15247.945..15248.063 rows=213 loops=1)
     
    300293
    301294По оптимизацијата беше забележано умерено подобрување:
    302 
    303295 * од ~15.4 s
    304296 * на ~15.2 s
     
    306298И покрај додадените индекси, PostgreSQL продолжи да користи {{{Sequential Scan}}} бидејќи query-от обработува огромен број редици и користи сложени aggregation операции како {{{AVG}}}, {{{COUNT}}} и {{{GROUP BY}}}.
    307299
    308 Во вакви ситуации planner-от проценува дека sequential processing е поефикасен од index traversal, па индексите имаат ограничено влијание врз вкупното време на извршување.
     300Во вакви ситуации planner-от проценува дека sequential processing е поефикасен од index traversal, па индексите имаат ограничено влијание врз вкупното време на извршување. Поради ова, беше одлучено да се примени дополнителна оптимизација преку Материјализиран Поглед.
     301
     302=== Оптимизација со Материјализиран Поглед ===
     303Бидејќи индексите не можеа значително да го подобрат времето на извршување поради природата на query-от (full-table aggregation со {{{GROUP BY}}} и повеќе {{{Hash Join}}} операции), беше креиран Материјализиран Поглед ({{{MATERIALIZED VIEW}}}) кој ја зачувува пресметаната агрегација и овозможува директно пребарување врз резултатот.
     304
     305За разлика од обичниот поглед кој го извршува query-от секој пат, Материјализираниот Поглед ги зачувува резултатите физички на диск, со што филтерот {{{WHERE city = 'Skopje'}}} работи врз само неколку стотици редици наместо врз милиони.
     306{{{
     307CREATE MATERIALIZED VIEW mv_public_artist_profiles AS
     308SELECT
     309    b.bookable_id,
     310    b.display_name,
     311    b.bookable_type,
     312    l.city,
     313    g.genre_name,
     314    ROUND(AVG(r.rating), 2) AS average_rating,
     315    COUNT(r.review_id)      AS total_reviews
     316FROM Bookable b
     317LEFT JOIN Location l       ON b.location_id = l.location_id
     318LEFT JOIN BookableGenre bg ON b.bookable_id = bg.bookable_id
     319LEFT JOIN Genre g          ON bg.genre_id = g.genre_id
     320LEFT JOIN Offer o          ON b.bookable_id = o.bookable_id
     321LEFT JOIN Booking bk       ON bk.offer_id = o.offer_id
     322LEFT JOIN Review r         ON r.booking_id = bk.booking_id
     323GROUP BY b.bookable_id, b.display_name, b.bookable_type, l.city, g.genre_name;
     324
     325CREATE UNIQUE INDEX idx_mv_profiles_bookable_id
     326ON mv_public_artist_profiles(bookable_id);
     327
     328CREATE INDEX idx_mv_profiles_city
     329ON mv_public_artist_profiles(city);
     330
     331CREATE INDEX idx_mv_profiles_rating
     332ON mv_public_artist_profiles(average_rating DESC);
     333}}}
     334
     335=== Време на извршување со Материјализиран Поглед ===
     336'''3.1 - 0.147 ms'''
     337{{{
     338Bitmap Heap Scan on mv_public_artist_profiles  (cost=4.35..24.46 rows=9 width=856) (actual time=0.040..0.114 rows=213 loops=1)
     339  Recheck Cond: ((city)::text = 'Skopje'::text)
     340  Heap Blocks: exact=16
     341  ->  Bitmap Index Scan on idx_mv_profiles_city  (cost=0.00..4.34 rows=9 width=0) (actual time=0.022..0.022 rows=213 loops=1)
     342        Index Cond: ((city)::text = 'Skopje'::text)
     343Planning Time: 0.275 ms
     344Execution Time: 0.147 ms
     345}}}
     346
     347По креирањето на Материјализираниот Поглед беше забележано драстично подобрување:
     348 * од ~15.2 s (со индекси)
     349 * на ~0.147 ms (со Материјализиран Поглед)
     350
     351Наместо да ги скенира милионите редици од табелите {{{Offer}}}, {{{Booking}}} и {{{Review}}}, PostgreSQL сега користи {{{Bitmap Index Scan}}} директно врз зачуваниот резултат преку индексот на {{{city}}}. Ова претставува подобрување од околу '''103,000 пати''' во споредба со оригиналниот query со индекси.
     352
     353За да останат податоците ажурирани, Материјализираниот Поглед се освежува по секоја промена на релевантните табели:
     354{{{
     355REFRESH MATERIALIZED VIEW CONCURRENTLY mv_public_artist_profiles;
     356}}}
    309357
    310358