Changes between Version 6 and Version 7 of QueryOptimization


Ignore:
Timestamp:
05/26/26 22:20:19 (16 hours ago)
Author:
231088
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v6 v7  
    391391
    392392Во вакви ситуации planner-от проценува дека sequential processing е поефикасен од index traversal, па индексите имаат ограничено влијание врз вкупното време на извршување.
     393
     394
     395
     396== 5. Анализа и оптимизација на vw_artist_dashboard ==
     397
     398Погледот {{{vw_artist_dashboard}}} се користи за прикажување на статистики за артистите и бендовите, вклучувајќи број на bookings, вкупна заработка и просечен рејтинг. Овој поглед се користи во artist dashboard делот од апликацијата.
     399
     400Прашалникот кој беше тестиран е следниот:
     401
     402{{{
     403SELECT *
     404FROM vw_artist_dashboard
     405WHERE average_rating >= 4.5;
     406}}}
     407
     408=== Време на извршување без индекси ===
     409
     410'''5.1 - 32835.819 ms'''
     411
     412{{{
     413HashAggregate  (cost=1485307.72..1485320.22 rows=200 width=87) (actual time=32833.146..32833.154 rows=0 loops=1)
     414  Group Key: b.bookable_id
     415  Filter: (round(avg(r.rating), 2) >= 4.5)
     416  ->  Hash Right Join
     417        ->  Hash Left Join
     418              ->  Seq Scan on offer o
     419              ->  Seq Scan on booking bk
     420              ->  Seq Scan on payment p
     421              ->  Seq Scan on review r
     422Planning Time: 0.945 ms
     423Execution Time: 32835.819 ms
     424}}}
     425
     426При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} врз табелите {{{Offer}}}, {{{Booking}}}, {{{Payment}}} и {{{Review}}}, како и {{{HashAggregate}}} операции за пресметување на заработката и просечниот рејтинг.
     427
     428Поради големиот број редици и aggregation операции, query-от имаше многу долго време на извршување.
     429
     430За оптимизација беа додадени следните индекси:
     431
     432{{{
     433CREATE INDEX idx_offer_bookable
     434ON Offer(bookable_id);
     435
     436CREATE INDEX idx_booking_offer
     437ON Booking(offer_id);
     438
     439CREATE INDEX idx_payment_booking
     440ON Payment(booking_id);
     441
     442CREATE INDEX idx_payment_status
     443ON Payment(payment_status);
     444
     445CREATE INDEX idx_review_booking
     446ON Review(booking_id);
     447
     448CREATE INDEX idx_review_rating
     449ON Review(rating);
     450}}}
     451
     452=== Време на извршување со индекси ===
     453
     454'''5.1 - 30002.268 ms'''
     455
     456{{{
     457HashAggregate  (cost=1485307.72..1485320.22 rows=200 width=87) (actual time=29999.572..29999.580 rows=0 loops=1)
     458  Group Key: b.bookable_id
     459  Filter: (round(avg(r.rating), 2) >= 4.5)
     460  ->  Hash Right Join
     461        ->  Hash Left Join
     462              ->  Seq Scan on offer o
     463              ->  Seq Scan on booking bk
     464              ->  Seq Scan on payment p
     465              ->  Seq Scan on review r
     466Planning Time: 1.395 ms
     467Execution Time: 30002.268 ms
     468}}}
     469
     470По оптимизацијата беше забележано подобрување кај query-от што филтрира според просечен рејтинг:
     471
     472 * од ~32.8 s
     473 * на ~30.0 s
     474
     475И покрај тоа што PostgreSQL продолжи да користи {{{Sequential Scan}}}, индексите помогнаа при join операциите и hash processing, што резултираше со побрзо извршување на query-от.
     476
     477Бидејќи погледот користи сложени aggregation операции како {{{SUM}}}, {{{AVG}}}, {{{COUNT}}} и {{{GROUP BY}}}, planner-от проценува дека sequential processing е поефикасен од index traversal при обработка на голем број редици.