| | 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 | {{{ |
| | 900 | SELECT * |
| | 901 | FROM vw_pending_payments |
| | 902 | WHERE payment_status = 'PENDING'; |
| | 903 | }}} |
| | 904 | |
| | 905 | === Време на извршување без индекси === |
| | 906 | |
| | 907 | '''9.1 - 12555.538 ms''' |
| | 908 | |
| | 909 | {{{ |
| | 910 | Gather (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 |
| | 919 | Planning Time: 2.158 ms |
| | 920 | Execution 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 | {{{ |
| | 928 | CREATE INDEX idx_payment_status |
| | 929 | ON Payment(payment_status); |
| | 930 | |
| | 931 | CREATE INDEX idx_payment_booking |
| | 932 | ON Payment(booking_id); |
| | 933 | |
| | 934 | CREATE INDEX idx_booking_offer |
| | 935 | ON Booking(offer_id); |
| | 936 | |
| | 937 | CREATE INDEX idx_offer_bookable |
| | 938 | ON Offer(bookable_id); |
| | 939 | |
| | 940 | CREATE INDEX idx_offer_request |
| | 941 | ON Offer(request_id); |
| | 942 | |
| | 943 | CREATE INDEX idx_bookingrequest_eventdate |
| | 944 | ON BookingRequest(event_date); |
| | 945 | |
| | 946 | CREATE INDEX idx_bookingrequest_location |
| | 947 | ON BookingRequest(location_id); |
| | 948 | |
| | 949 | CREATE INDEX idx_location_city |
| | 950 | ON Location(city); |
| | 951 | |
| | 952 | CREATE INDEX idx_bookable_id |
| | 953 | ON Bookable(bookable_id); |
| | 954 | }}} |
| | 955 | |
| | 956 | === Време на извршување со индекси === |
| | 957 | |
| | 958 | '''9.1 - 10043.475 ms''' |
| | 959 | |
| | 960 | {{{ |
| | 961 | Gather (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 |
| | 970 | Planning Time: 3.268 ms |
| | 971 | Execution 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 операциите. |