Changes between Version 5 and Version 6 of QueryOptimization


Ignore:
Timestamp:
05/26/26 22:18:11 (16 hours ago)
Author:
231088
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v5 v6  
    307307
    308308Во вакви ситуации planner-от проценува дека sequential processing е поефикасен од index traversal, па индексите имаат ограничено влијание врз вкупното време на извршување.
     309
     310
     311== 4. Анализа и оптимизација на vw_trending_bookables ==
     312
     313Погледот {{{vw_trending_bookables}}} се користи за прикажување на најпопуларните артисти и бендови според бројот на bookings и просечниот рејтинг. Овој поглед се користи за homepage recommendations и analytics.
     314
     315Прашалникот кој беше тестиран е следниот:
     316
     317{{{
     318SELECT *
     319FROM vw_trending_bookables
     320ORDER BY total_bookings DESC
     321LIMIT 10;
     322}}}
     323
     324=== Време на извршување без индекси ===
     325
     326'''4.1 - 22675.664 ms'''
     327
     328{{{
     329Limit  (cost=1149893.25..1149893.28 rows=10 width=61) (actual time=22673.555..22673.564 rows=10 loops=1)
     330  ->  Sort
     331        Sort Key: (count(bk.booking_id)) DESC
     332        ->  HashAggregate
     333              Group Key: b.bookable_id
     334              ->  Hash Right Join
     335                    ->  Hash Left Join
     336                          ->  Seq Scan on offer o
     337                          ->  Seq Scan on booking bk
     338                          ->  Seq Scan on review r
     339Planning Time: 1.190 ms
     340Execution Time: 22675.664 ms
     341}}}
     342
     343При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} врз табелите {{{Offer}}}, {{{Booking}}} и {{{Review}}}, како и {{{HashAggregate}}} и {{{Sort}}} операции за пресметување на бројот на bookings и просечниот рејтинг.
     344
     345Поради огромниот број редици и aggregation операции, query-от имаше многу долго време на извршување.
     346
     347За оптимизација беа додадени следните индекси:
     348
     349{{{
     350CREATE INDEX idx_offer_bookable
     351ON Offer(bookable_id);
     352
     353CREATE INDEX idx_booking_offer
     354ON Booking(offer_id);
     355
     356CREATE INDEX idx_review_booking
     357ON Review(booking_id);
     358
     359CREATE INDEX idx_review_rating
     360ON Review(rating);
     361
     362CREATE INDEX idx_bookable_id
     363ON Bookable(bookable_id);
     364}}}
     365
     366=== Време на извршување со индекси ===
     367
     368'''4.1 - 22582.888 ms'''
     369
     370{{{
     371Limit  (cost=1149893.25..1149893.28 rows=10 width=61) (actual time=22580.768..22580.777 rows=10 loops=1)
     372  ->  Sort
     373        Sort Key: (count(bk.booking_id)) DESC
     374        ->  HashAggregate
     375              Group Key: b.bookable_id
     376              ->  Hash Right Join
     377                    ->  Hash Left Join
     378                          ->  Seq Scan on offer o
     379                          ->  Seq Scan on booking bk
     380                          ->  Seq Scan on review r
     381Planning Time: 1.633 ms
     382Execution Time: 22582.888 ms
     383}}}
     384
     385По оптимизацијата беше забележано мало подобрување кај query-от што ги прикажува најпопуларните артисти:
     386
     387 * од ~22.6 s
     388 * на ~22.5 s
     389
     390И покрај додадените индекси, PostgreSQL продолжи да користи {{{Sequential Scan}}} бидејќи query-от обработува огромен број редици и користи сложени aggregation операции како {{{COUNT}}}, {{{AVG}}}, {{{GROUP BY}}} и {{{ORDER BY}}}.
     391
     392Во вакви ситуации planner-от проценува дека sequential processing е поефикасен од index traversal, па индексите имаат ограничено влијание врз вкупното време на извршување.