Changes between Version 11 and Version 12 of QueryOptimization


Ignore:
Timestamp:
05/26/26 22:32:13 (7 hours ago)
Author:
231088
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v11 v12  
    888888
    889889По оптимизацијата PostgreSQL започна да користи индексно пребарување наместо {{{Sequential Scan}}} за дел од join операциите, што значително го намали времето на извршување и бројот на обработени редици.
     890
     891
     892
     893== 9. Анализа и оптимизација на vw_pending_payments ==
     894
     895Погледот {{{vw_pending_payments}}} се користи за прикажување на pending и unpaid payments поврзани со bookings, артистите и настаните. Овој поглед се користи за financial tracking, artist dashboard и admin payment management.
     896
     897Прашалникот кој беше тестиран е следниот:
     898
     899{{{
     900SELECT *
     901FROM vw_pending_payments
     902WHERE payment_status = 'PENDING';
     903}}}
     904
     905=== Време на извршување без индекси ===
     906
     907'''9.1 - 12555.538 ms'''
     908
     909{{{
     910Gather  (cost=579119.54..1056337.52 rows=4001410 width=258) (actual time=9089.762..12399.923 rows=4001410 loops=1)
     911  ->  Hash Left Join
     912        ->  Hash Join
     913              ->  Parallel Hash Join
     914                    ->  Parallel Seq Scan on payment p
     915                          Filter: ((payment_status)::text = 'PENDING'::text)
     916                    ->  Parallel Seq Scan on booking bk
     917                    ->  Parallel Seq Scan on offer o
     918                    ->  Parallel Seq Scan on bookingrequest br
     919Planning Time: 2.158 ms
     920Execution Time: 12555.538 ms
     921}}}
     922
     923При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} и {{{Parallel Sequential Scan}}} врз табелите {{{Payment}}}, {{{BookingRequest}}}, {{{Offer}}} и {{{Booking}}}. Ова предизвикуваше долго време на извршување бидејќи системот обработуваше милиони редици за да ги пронајде потребните payments и requests.
     924
     925За оптимизација беа додадени следните индекси:
     926
     927{{{
     928CREATE INDEX idx_payment_status
     929ON Payment(payment_status);
     930
     931CREATE INDEX idx_payment_booking
     932ON Payment(booking_id);
     933
     934CREATE INDEX idx_booking_offer
     935ON Booking(offer_id);
     936
     937CREATE INDEX idx_offer_bookable
     938ON Offer(bookable_id);
     939
     940CREATE INDEX idx_offer_request
     941ON Offer(request_id);
     942
     943CREATE INDEX idx_bookingrequest_eventdate
     944ON BookingRequest(event_date);
     945
     946CREATE INDEX idx_bookingrequest_location
     947ON BookingRequest(location_id);
     948
     949CREATE INDEX idx_location_city
     950ON Location(city);
     951
     952CREATE INDEX idx_bookable_id
     953ON Bookable(bookable_id);
     954}}}
     955
     956=== Време на извршување со индекси ===
     957
     958'''9.1 - 10043.475 ms'''
     959
     960{{{
     961Gather  (cost=579119.54..1056337.52 rows=4001410 width=258) (actual time=7499.460..9892.291 rows=4001410 loops=1)
     962  ->  Hash Left Join
     963        ->  Hash Join
     964              ->  Parallel Hash Join
     965                    ->  Parallel Seq Scan on payment p
     966                          Filter: ((payment_status)::text = 'PENDING'::text)
     967                    ->  Parallel Seq Scan on booking bk
     968                    ->  Parallel Seq Scan on offer o
     969                    ->  Parallel Seq Scan on bookingrequest br
     970Planning Time: 3.268 ms
     971Execution Time: 10043.475 ms
     972}}}
     973
     974По оптимизацијата беше забележано подобрување кај query-от што пребарува според {{{payment_status = 'PENDING'}}}:
     975
     976 * од ~12.5 s
     977 * на ~10.0 s
     978
     979И покрај тоа што PostgreSQL продолжи да користи делумни {{{Sequential Scan}}} операции поради големиот број редици, индексите помогнаа кај join операциите и дел од filtering процесите, што овозможи побрзо извршување на query-ите и подобар execution plan.
     980
     981Во вакви ситуации planner-от проценува дека sequential processing е поефикасен за обработка на огромен број редици, па индексите имаат ограничено влијание врз aggregation и join операциите.