| | 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 |
| | 778 | SELECT * |
| | 779 | FROM vw_artist_incoming_requests |
| | 780 | WHERE city = 'Skopje'; |
| | 781 | |
| | 782 | -- 8.2 |
| | 783 | SELECT * |
| | 784 | FROM vw_artist_incoming_requests |
| | 785 | WHERE event_date >= '2026-07-01' |
| | 786 | AND event_date < '2026-08-01'; |
| | 787 | }}} |
| | 788 | |
| | 789 | === Време на извршување без индекси === |
| | 790 | |
| | 791 | '''8.1 - 969.055 ms''' |
| | 792 | |
| | 793 | {{{ |
| | 794 | Gather (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 |
| | 801 | Planning Time: 0.612 ms |
| | 802 | Execution Time: 969.055 ms |
| | 803 | }}} |
| | 804 | |
| | 805 | '''8.2 - 8618.837 ms''' |
| | 806 | |
| | 807 | {{{ |
| | 808 | Gather (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)) |
| | 815 | Planning Time: 0.637 ms |
| | 816 | Execution Time: 8618.837 ms |
| | 817 | }}} |
| | 818 | |
| | 819 | При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} и {{{Parallel Sequential Scan}}} врз табелите {{{Offer}}} и {{{BookingRequest}}}. Ова предизвикуваше дополнително време на извршување бидејќи системот обработуваше милиони редици за да ги пронајде потребните requests. |
| | 820 | |
| | 821 | За оптимизација беа додадени следните индекси: |
| | 822 | |
| | 823 | {{{ |
| | 824 | CREATE INDEX idx_offer_bookable |
| | 825 | ON Offer(bookable_id); |
| | 826 | |
| | 827 | CREATE INDEX idx_offer_request |
| | 828 | ON Offer(request_id); |
| | 829 | |
| | 830 | CREATE INDEX idx_bookingrequest_location |
| | 831 | ON BookingRequest(location_id); |
| | 832 | |
| | 833 | CREATE INDEX idx_bookingrequest_eventdate |
| | 834 | ON BookingRequest(event_date); |
| | 835 | |
| | 836 | CREATE INDEX idx_location_city |
| | 837 | ON Location(city); |
| | 838 | |
| | 839 | CREATE INDEX idx_bookable_id |
| | 840 | ON Bookable(bookable_id); |
| | 841 | }}} |
| | 842 | |
| | 843 | === Време на извршување со индекси === |
| | 844 | |
| | 845 | '''8.1 - 617.537 ms''' |
| | 846 | |
| | 847 | {{{ |
| | 848 | Gather (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 |
| | 855 | Planning Time: 0.850 ms |
| | 856 | Execution Time: 617.537 ms |
| | 857 | }}} |
| | 858 | |
| | 859 | '''8.2 - 3438.192 ms''' |
| | 860 | |
| | 861 | {{{ |
| | 862 | Gather (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)) |
| | 869 | Planning Time: 0.865 ms |
| | 870 | Execution 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 операциите, што значително го намали времето на извршување и бројот на обработени редици. |