Changes between Version 13 and Version 14 of QueryOptimization


Ignore:
Timestamp:
05/26/26 23:11:22 (6 hours ago)
Author:
231088
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v13 v14  
    395395
    396396== 5. Анализа и оптимизација на vw_artist_dashboard ==
    397 
    398397Погледот {{{vw_artist_dashboard}}} се користи за прикажување на статистики за артистите и бендовите, вклучувајќи број на bookings, вкупна заработка и просечен рејтинг. Овој поглед се користи во artist dashboard делот од апликацијата.
    399398
    400399Прашалникот кој беше тестиран е следниот:
    401 
    402400{{{
    403401SELECT *
     
    407405
    408406=== Време на извршување без индекси ===
    409 
    410 '''5.1 - 32835.819 ms'''
    411 
     407'''5.1 - 66721.664 ms'''
    412408{{{
    413409HashAggregate  (cost=1485307.72..1485320.22 rows=200 width=87) (actual time=66672.114..66672.131 rows=0 loops=1)
    414 Group Key: b.bookable_id
     410  Group Key: b.bookable_id
    415411  Filter: (round(avg(r.rating), 2) >= 4.5)
    416412  ->  Hash Right Join
     
    429425
    430426За оптимизација беа додадени следните индекси:
    431 
    432427{{{
    433428CREATE INDEX idx_offer_bookable
     
    451446
    452447=== Време на извршување со индекси ===
    453 
    454 '''5.1 - 30002.268 ms'''
    455 
     448'''5.1 - 31275.268 ms'''
    456449{{{
    457450HashAggregate  (cost=1485307.72..1485320.22 rows=200 width=87) (actual time=29999.572..29999.580 rows=0 loops=1)
     
    465458              ->  Seq Scan on review r
    466459Planning Time: 1.395 ms
    467 Execution Time: 30002.268 ms
     460Execution Time: 31275.268 ms
    468461}}}
    469462
    470463По оптимизацијата беше забележано подобрување кај query-от што филтрира според просечен рејтинг:
    471 
    472  * од ~32.8 s
    473  * на ~30.0 s
     464 * од ~66.7 s
     465 * на ~31.3 s
    474466
    475467И покрај тоа што PostgreSQL продолжи да користи {{{Sequential Scan}}}, индексите помогнаа при join операциите и hash processing, што резултираше со побрзо извршување на query-от.
    476468
    477 Бидејќи погледот користи сложени aggregation операции како {{{SUM}}}, {{{AVG}}}, {{{COUNT}}} и {{{GROUP BY}}}, planner-от проценува дека sequential processing е поефикасен од index traversal при обработка на голем број редици.
     469Бидејќи погледот користи сложени aggregation операции како {{{SUM}}}, {{{AVG}}}, {{{COUNT}}} и {{{GROUP BY}}}, planner-от проценува дека sequential processing е поефикасен од index traversal при обработка на голем број редици. Поради ова, беше одлучено да се примени дополнителна оптимизација преку Materijализиран Поглед.
     470
     471=== Оптимизација со Материјализиран Поглед ===
     472Бидејќи индексите не можеа значително да го подобрат времето на извршување поради природата на query-от (full-table aggregation со {{{GROUP BY}}}), беше креиран Материјализиран Поглед ({{{MATERIALIZED VIEW}}}) кој ја зачувува пресметаната агрегација и овозможува директно пребарување врз резултатот.
     473
     474За разлика од обичниот поглед кој го извршува query-от секој пат, Материјализираниот Поглед ги зачувува резултатите физички на диск, со што филтерот {{{WHERE average_rating >= 4.5}}} работи врз само 600 редици наместо врз милиони.
     475{{{
     476CREATE MATERIALIZED VIEW mv_artist_dashboard AS
     477SELECT
     478    b.bookable_id,
     479    b.display_name,
     480    COUNT(bk.booking_id) AS total_bookings,
     481    SUM(
     482        CASE
     483            WHEN p.payment_status = 'PAID' THEN p.amount
     484            ELSE 0
     485        END
     486    ) AS total_earnings,
     487    ROUND(AVG(r.rating), 2) AS average_rating
     488FROM Bookable b
     489LEFT JOIN Offer o    ON b.bookable_id = o.bookable_id
     490LEFT JOIN Booking bk ON bk.offer_id = o.offer_id
     491LEFT JOIN Payment p  ON p.booking_id = bk.booking_id
     492LEFT JOIN Review r   ON r.booking_id = bk.booking_id
     493GROUP BY b.bookable_id, b.display_name;
     494
     495CREATE UNIQUE INDEX idx_mv_dashboard_bookable_id
     496ON mv_artist_dashboard(bookable_id);
     497
     498CREATE INDEX idx_mv_dashboard_rating
     499ON mv_artist_dashboard(average_rating);
     500}}}
     501
     502=== Време на извршување со Материјализиран Поглед ===
     503'''5.1 - 0.111 ms'''
     504{{{
     505Seq Scan on mv_artist_dashboard  (cost=0.00..15.50 rows=200 width=394) (actual time=0.090..0.090 rows=0 loops=1)
     506  Filter: (average_rating >= 4.5)
     507  Rows Removed by Filter: 600
     508Planning Time: 0.321 ms
     509Execution Time: 0.111 ms
     510}}}
     511
     512По креирањето на Материјализираниот Поглед беше забележано драстично подобрување:
     513 * од ~31.3 s (со индекси)
     514 * на ~0.1 ms (со Материјализиран Поглед)
     515
     516Наместо да ги скенира милионите редици од табелите {{{Offer}}}, {{{Booking}}}, {{{Payment}}} и {{{Review}}}, PostgreSQL сега скенира само 600 редици од зачуваниот резултат. Ова претставува подобрување од околу '''281,000 пати''' во споредба со оригиналниот query со индекси.
     517
     518За да останат податоците ажурирани, Материјализираниот Поглед се освежува по секоја промена на релевантните табели:
     519{{{
     520REFRESH MATERIALIZED VIEW CONCURRENTLY mv_artist_dashboard;
     521}}}
     522
    478523
    479524