Changes between Version 95 and Version 96 of QueryOptimization
- Timestamp:
- 07/01/26 00:01:06 (5 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
QueryOptimization
v95 v96 881 881 == Анализа и оптимизација на `Event_Overall_Ratings` 882 882 883 Овој материјализиран поглед врши брза статистичка анализа на задоволството на публиката преку пресметување на просечната оцена за секој настан поединечно. Со оглед на тоа што користи агрегациски функции ('''COUNT''' и '''AVG'''), тој е зачуван како материјализиран поглед со цел да се избегне постојано пресметување и да се зачуваат перформансите на базата.883 Овој материјализиран поглед врши агрегациска анализа на задоволството на публиката. Со пресметување на просечните оценки ('''AVG''') и бројот на рецензии ('''COUNT''') по настан, тој обезбедува клучни перформанс индикатори (KPIs) за организаторите. Материјализирањето е избрано за да се обезбеди висока брзина на вчитување при прикажување на статистички извештаи, избегнувајќи комплексни пресметки при секој прашалник. 884 884 885 885 {{{ 886 886 887 887 CREATE MATERIALIZED VIEW "Event_Overall_Ratings" AS 888 SELECT 889 e.event_id, 890 e.name AS event_name, 891 eh.event_happening_id, 892 eh.event_time, 893 COUNT(ehr.rating_id) AS total_reviews, 894 COALESCE(ROUND(AVG(ehr.rating), 2), 0.00) AS average_rating 888 SELECT e.event_id, e.name AS event_name, eh.event_happening_id, eh.event_time, 889 COUNT(ehr.rating_id) AS total_reviews, COALESCE(ROUND(AVG(ehr.rating), 2), 0.00) AS average_rating 895 890 FROM "Event" e 896 JOIN "Event_Happening" eh ON e.event_id = eh.event_id 897 LEFT JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id 891 JOIN "Event_Happening" eh ON e.event_id = eh.event_id 892 LEFT JOIN "Event_Happening_Rating" ehr ON eh.event_happening_id = ehr.event_happening_id 893 WHERE e.is_active = TRUE 898 894 GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time; 899 895 900 896 }}} 901 897 902 Погледот е веќе најоптимално напишан и не треба да се преуредува.898 Погледот е веќе најоптимално напишан со користење на постоечките уникатни констреинти и не бара дополнителни модификации. 903 899 904 900 ==== 1. Примарен филтер: … … 922 918 == Анализа и оптимизација на `User_Order_History` 923 919 924 Овој материјализиран поглед генерира финансиски профил и историја на нарачки за секој корисник, сумирајќи ги направените трошоци на ниво на главна нарачка. Тој нуди брз увид во точниот број на купени ставки, бројот на рефундирани билети како и вкупната сума на вратени пари по нарачка без оптоварување на трансакциските табели.920 Овој поглед генерира финансиски профил за секој корисник, сумирајќи ги направените нарачки и повратните средства. Оптимизиран е за сметководствени цели, нудејќи јасен увид во обемот на купени и рефундирани ставки. Материјализираната природа на погледот значително го растеретува серверот при генерирање на кориснички „Dashboard“ извештаи. 925 921 926 922 {{{ 927 923 928 924 CREATE MATERIALIZED VIEW "User_Order_History" AS 929 SELECT u.user_id, 930 u.username, 931 o.order_id, 932 o.order_time, 933 o.order_amount, 925 SELECT u.user_id, u.username, o.order_id, o.order_time, o.order_amount, 934 926 COALESCE(items.total_items_ordered, 0) AS total_items_ordered, 935 927 COALESCE(items.total_items_refunded, 0) AS total_items_refunded, 936 928 COALESCE(items.total_amount_refunded, 0.00) AS total_amount_refunded 937 929 FROM "User" u 938 JOIN "Regular_User" ru ON u.user_id = ru.user_id 939 JOIN "Ticket_Order" o ON ru.user_id = o.user_id 940 LEFT JOIN ( 941 SELECT 942 toi.order_id, 943 COUNT(toi.order_item_id) AS total_items_ordered, 944 COUNT(tri.refund_item_id) AS total_items_refunded, 945 SUM(COALESCE(tri.item_price, 0.00)) AS total_amount_refunded 946 FROM "Ticket_Order_Item" toi 947 LEFT JOIN "Ticket_Refund_Item" tri ON toi.order_item_id = tri.order_item_id 948 GROUP BY toi.order_id 949 ) items ON o.order_id = items.order_id; 950 951 }}} 952 953 Погледот е веќе најоптимално напишан и не треба да се преуредува. 930 JOIN "Regular_User" ru ON u.user_id = ru.user_id 931 JOIN "Ticket_Order" o ON ru.user_id = o.user_id 932 LEFT JOIN ( 933 SELECT toi.order_id, COUNT(toi.order_item_id) AS total_items_ordered, 934 COUNT(tri.refund_item_id) AS total_items_refunded, 935 SUM(COALESCE(tri.item_price, 0.00)) AS total_amount_refunded 936 FROM "Ticket_Order_Item" toi 937 LEFT JOIN "Ticket_Refund_Item" tri ON toi.order_item_id = tri.order_item_id 938 GROUP BY toi.order_id 939 ) items ON o.order_id = items.order_id 940 WHERE u.is_active = TRUE; 941 942 }}} 943 944 Погледот е веќе најоптимално напишан со користење на постоечките уникатни констреинти и не бара дополнителни модификации. 954 945 955 946 ==== 1. Примарен филтер: … … 973 964 == Анализа и оптимизација на `Venue_Occupancy_Report` 974 965 975 Овој комплексен аналитички поглед ја мери успешноста на продажбата преку споредба на бројот на продадени карти со максималниот капацитет на седишта во салата. Крајниот резултат дава прецизен процент на пополнетост за секој термин на настан, што е клучен бизнис индикатор за менаџерите и организаторите.966 Овој аналитички поглед го мери „ефектот на продажба“ преку пресметка на процентот на пополнетост (`occupancy_percentage`) на секој термин. Тој е примарна алатка за менаџерите кои треба да го следат успехот на настанот во реално време. Имплементиран е како материјализиран поглед за да поддржи брзо аналитичко известување без дополнително оптоварување на базата со тешки '''JOIN''' операции врз табелите за нарачки. 976 967 977 968 {{{ 978 969 979 970 CREATE MATERIALIZED VIEW "Venue_Occupancy_Report" AS 980 SELECT e.event_id, 981 e.name AS event_name, 982 eh.event_happening_id, 983 eh.event_time, 984 v.name AS venue_name, 985 v.number_of_seats AS total_venue_capacity, 986 COALESCE(stats.sold_count, 0) AS tickets_sold, 971 SELECT e.event_id, e.name AS event_name, eh.event_happening_id, eh.event_time, v.name AS venue_name, 972 v.number_of_seats AS total_venue_capacity, COALESCE(stats.sold_count, 0) AS tickets_sold, 987 973 ROUND((COALESCE(stats.sold_count, 0)::NUMERIC / v.number_of_seats::NUMERIC) * 100, 2) AS occupancy_percentage 988 974 FROM "Event" e 989 JOIN "Event_Happening" eh ON e.event_id = eh.event_id 990 JOIN "Venue" v ON eh.venue_id = v.venue_id 991 LEFT JOIN ( 992 SELECT t.event_happening_id, COUNT(toi.order_item_id) AS sold_count 993 FROM "Ticket_Order_Item" toi 994 JOIN "Ticket" t ON toi.ticket_id = t.ticket_id 995 GROUP BY t.event_happening_id 996 ) stats ON eh.event_happening_id = stats.event_happening_id 975 JOIN "Event_Happening" eh ON e.event_id = eh.event_id 976 JOIN "Venue" v ON eh.venue_id = v.venue_id 977 LEFT JOIN ( 978 SELECT t.event_happening_id, COUNT(toi.order_item_id) AS sold_count 979 FROM "Ticket_Order_Item" toi 980 JOIN "Ticket" t ON toi.ticket_id = t.ticket_id 981 GROUP BY t.event_happening_id 982 ) stats ON eh.event_happening_id = stats.event_happening_id 983 WHERE e.is_active = TRUE 997 984 GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time, v.name, v.number_of_seats, stats.sold_count; 998 985 999 986 }}} 1000 987 1001 Погледот е веќе најоптимално напишан и не треба да се преуредува.988 Погледот е веќе најоптимално напишан со користење на постоечките уникатни констреинти и не бара дополнителни модификации. 1002 989 1003 990 ==== 1. Примарен филтер:
