Changes between Version 9 and Version 10 of QueryOptimization


Ignore:
Timestamp:
05/26/26 22:30:03 (7 hours ago)
Author:
231088
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v9 v10  
    765765
    766766По оптимизацијата PostgreSQL престана да користи {{{Sequential Scan}}} за дел од пребарувањата и започна да користи индексно пребарување, што значително го намали времето на извршување и бројот на обработени редици.
     767
     768
     769
     770== 8. Анализа и оптимизација на vw_artist_incoming_requests ==
     771
     772Погледот {{{vw_artist_incoming_requests}}} се користи за прикажување на incoming requests за артистите и бендовите, вклучувајќи тип на настан, датум, град и понудена цена. Овој поглед се користи во artist dashboard делот од апликацијата.
     773
     774Прашалниците кои беа тестирани се следните:
     775
     776{{{
     777-- 8.1
     778SELECT *
     779FROM vw_artist_incoming_requests
     780WHERE city = 'Skopje';
     781
     782-- 8.2
     783SELECT *
     784FROM vw_artist_incoming_requests
     785WHERE event_date >= '2026-07-01'
     786AND event_date < '2026-08-01';
     787}}}
     788
     789=== Време на извршување без индекси ===
     790
     791'''8.1 - 969.055 ms'''
     792
     793{{{
     794Gather  (cost=204886.61..536618.31 rows=800000 width=254) (actual time=957.362..966.909 rows=0 loops=1)
     795  ->  Hash Join
     796        ->  Parallel Hash Join
     797              ->  Parallel Seq Scan on bookingrequest br
     798              ->  Seq Scan on location l
     799                    Filter: ((city)::text = 'Skopje'::text)
     800        ->  Parallel Seq Scan on offer o
     801Planning Time: 0.612 ms
     802Execution Time: 969.055 ms
     803}}}
     804
     805'''8.2 - 8618.837 ms'''
     806
     807{{{
     808Gather  (cost=209088.80..622293.48 rows=1677259 width=254) (actual time=7086.289..8549.231 rows=1701412 loops=1)
     809  ->  Hash Left Join
     810        ->  Parallel Hash Join
     811              ->  Parallel Seq Scan on offer o
     812              ->  Parallel Seq Scan on bookingrequest br
     813                    Filter: ((event_date >= '2026-07-01'::date)
     814                          AND (event_date < '2026-08-01'::date))
     815Planning Time: 0.637 ms
     816Execution Time: 8618.837 ms
     817}}}
     818
     819При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} и {{{Parallel Sequential Scan}}} врз табелите {{{Offer}}} и {{{BookingRequest}}}. Ова предизвикуваше дополнително време на извршување бидејќи системот обработуваше милиони редици за да ги пронајде потребните requests.
     820
     821За оптимизација беа додадени следните индекси:
     822
     823{{{
     824CREATE INDEX idx_offer_bookable
     825ON Offer(bookable_id);
     826
     827CREATE INDEX idx_offer_request
     828ON Offer(request_id);
     829
     830CREATE INDEX idx_bookingrequest_location
     831ON BookingRequest(location_id);
     832
     833CREATE INDEX idx_bookingrequest_eventdate
     834ON BookingRequest(event_date);
     835
     836CREATE INDEX idx_location_city
     837ON Location(city);
     838
     839CREATE INDEX idx_bookable_id
     840ON Bookable(bookable_id);
     841}}}
     842
     843=== Време на извршување со индекси ===
     844
     845'''8.1 - 617.537 ms'''
     846
     847{{{
     848Gather  (cost=1030.26..345626.04 rows=800000 width=254) (actual time=606.861..615.460 rows=0 loops=1)
     849  ->  Hash Join
     850        ->  Nested Loop
     851              ->  Hash Join
     852                    ->  Parallel Seq Scan on bookingrequest br
     853                    ->  Seq Scan on location l
     854              ->  Index Scan using idx_offer_request on offer o
     855Planning Time: 0.850 ms
     856Execution Time: 617.537 ms
     857}}}
     858
     859'''8.2 - 3438.192 ms'''
     860
     861{{{
     862Gather  (cost=209088.80..622293.48 rows=1677259 width=254) (actual time=2096.594..3369.469 rows=1701412 loops=1)
     863  ->  Hash Left Join
     864        ->  Parallel Hash Join
     865              ->  Parallel Seq Scan on offer o
     866              ->  Parallel Seq Scan on bookingrequest br
     867                    Filter: ((event_date >= '2026-07-01'::date)
     868                          AND (event_date < '2026-08-01'::date))
     869Planning Time: 0.865 ms
     870Execution Time: 3438.192 ms
     871}}}
     872
     873По оптимизацијата PostgreSQL започна да користи:
     874
     875 * {{{Index Scan}}}
     876 * {{{Nested Loop}}}
     877 * {{{Bitmap Heap Scan}}}
     878
     879Најголемо подобрување беше забележано кај query-от што пребарува според временски период:
     880
     881 * од ~8.6 s
     882 * на ~3.4 s
     883
     884Кај query-от што пребарува според град {{{city = 'Skopje'}}} времето на извршување се подобри:
     885
     886 * од ~969 ms
     887 * на ~617 ms
     888
     889По оптимизацијата PostgreSQL започна да користи индексно пребарување наместо {{{Sequential Scan}}} за дел од join операциите, што значително го намали времето на извршување и бројот на обработени редици.