Changes between Version 16 and Version 17 of QueryOptimization


Ignore:
Timestamp:
05/26/26 23:32:38 (6 hours ago)
Author:
231088
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v16 v17  
    10451045
    10461046== 9. Анализа и оптимизација на vw_pending_payments ==
    1047 
    10481047Погледот {{{vw_pending_payments}}} се користи за прикажување на pending и unpaid payments поврзани со bookings, артистите и настаните. Овој поглед се користи за financial tracking, artist dashboard и admin payment management.
    10491048
    10501049Прашалникот кој беше тестиран е следниот:
    1051 
    10521050{{{
    10531051SELECT *
     
    10571055
    10581056=== Време на извршување без индекси ===
    1059 
    10601057'''9.1 - 12555.538 ms'''
    1061 
    10621058{{{
    10631059Gather  (cost=579119.54..1056337.52 rows=4001410 width=258) (actual time=9089.762..12399.923 rows=4001410 loops=1)
     
    10771073
    10781074За оптимизација беа додадени следните индекси:
    1079 
    10801075{{{
    10811076CREATE INDEX idx_payment_status
     
    11081103
    11091104=== Време на извршување со индекси ===
    1110 
    11111105'''9.1 - 10043.475 ms'''
    1112 
    11131106{{{
    11141107Gather  (cost=579119.54..1056337.52 rows=4001410 width=258) (actual time=7499.460..9892.291 rows=4001410 loops=1)
     
    11261119
    11271120По оптимизацијата беше забележано подобрување кај query-от што пребарува според {{{payment_status = 'PENDING'}}}:
    1128 
    11291121 * од ~12.5 s
    11301122 * на ~10.0 s
     
    11321124И покрај тоа што PostgreSQL продолжи да користи делумни {{{Sequential Scan}}} операции поради големиот број редици, индексите помогнаа кај join операциите и дел од filtering процесите, што овозможи побрзо извршување на query-ите и подобар execution plan.
    11331125
    1134 Во вакви ситуации planner-от проценува дека sequential processing е поефикасен за обработка на огромен број редици, па индексите имаат ограничено влијание врз aggregation и join операциите.
     1126Во вакви ситуации planner-от проценува дека sequential processing е поефикасен за обработка на огромен број редици, па индексите имаат ограничено влијание врз aggregation и join операциите. Поради ова, беше одлучено да се примени дополнителна оптимизација преку Материјализиран Поглед.
     1127
     1128=== Оптимизација со Материјализиран Поглед ===
     1129Бидејќи индексите не можеа значително да го подобрат времето на извршување поради огромниот број редици кои се враќаат (4 милиони), беше креиран Материјализиран Поглед ({{{MATERIALIZED VIEW}}}) кој ги зачувува резултатите физички на диск и овозможува побрзо пребарување без да се поминува низ сите join операции секој пат.
     1130{{{
     1131CREATE MATERIALIZED VIEW mv_pending_payments AS
     1132SELECT
     1133    p.payment_id,
     1134    bk.booking_id,
     1135    b.bookable_id,
     1136    b.display_name,
     1137    p.amount,
     1138    p.payment_status,
     1139    br.event_date,
     1140    l.city
     1141FROM Payment p
     1142JOIN Booking bk        ON p.booking_id = bk.booking_id
     1143JOIN Offer o           ON bk.offer_id = o.offer_id
     1144JOIN Bookable b        ON o.bookable_id = b.bookable_id
     1145JOIN BookingRequest br ON o.request_id = br.request_id
     1146LEFT JOIN Location l   ON br.location_id = l.location_id;
     1147
     1148CREATE UNIQUE INDEX idx_mv_payments_payment_id
     1149ON mv_pending_payments(payment_id);
     1150
     1151CREATE INDEX idx_mv_payments_status
     1152ON mv_pending_payments(payment_status);
     1153
     1154CREATE INDEX idx_mv_payments_city
     1155ON mv_pending_payments(city);
     1156
     1157CREATE INDEX idx_mv_payments_event_date
     1158ON mv_pending_payments(event_date);
     1159}}}
     1160
     1161=== Време на извршување со Материјализиран Поглед ===
     1162'''9.1 - 866.538 ms'''
     1163{{{
     1164Seq Scan on mv_pending_payments  (cost=0.00..89763.15 rows=4001532 width=49) (actual time=0.059..731.011 rows=4001410 loops=1)
     1165  Filter: ((payment_status)::text = 'PENDING'::text)
     1166Planning Time: 0.468 ms
     1167Execution Time: 866.538 ms
     1168}}}
     1169
     1170По креирањето на Материјализираниот Поглед беше забележано подобрување:
     1171 * од ~10.0 s (со индекси)
     1172 * на ~866 ms (со Материјализиран Поглед)
     1173
     1174Подобрувањето е присутно, меѓутоа PostgreSQL сè уште користи {{{Seq Scan}}} врз Материјализираниот Поглед бидејќи query-от враќа речиси сите редици (4 милиони од вкупно 4 милиони). Во ваква ситуација index scan е поскап од sequential scan бидејќи нема селективност — скоро секоја редица го задоволува филтерот {{{payment_status = 'PENDING'}}}.
     1175
     1176Главното подобрување доаѓа од тоа што сложените {{{JOIN}}} операции меѓу {{{Payment}}}, {{{Booking}}}, {{{Offer}}}, {{{Bookable}}} и {{{BookingRequest}}} се пресметани однапред и зачувани, па PostgreSQL скенира само еден објект наместо пет табели.
     1177
     1178За да останат податоците ажурирани, Материјализираниот Поглед се освежува по секоја промена на статусот на плаќање:
     1179{{{
     1180REFRESH MATERIALIZED VIEW CONCURRENTLY mv_pending_payments;
     1181}}}