Changes between Version 81 and Version 82 of QueryOptimization


Ignore:
Timestamp:
06/30/26 00:56:55 (6 days ago)
Author:
231027
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v81 v82  
    10131013== Анализа и оптимизација на `User_Order_History`
    10141014
    1015 Овој материјализиран поглед врши брза статистичка анализа на задоволството на публиката преку пресметување на просечната оцена за секој настан поединечно. Со оглед на тоа што користи агрегациски функции ('''COUNT''' и '''AVG'''), тој е зачуван како материјализиран поглед со цел да се избегне постојано пресметување и да се зачуваат перформансите на базата.
     1015Овој материјализиран поглед генерира финансиски профил и историја на нарачки за секој корисник, сумирајќи ги направените трошоци на ниво на главна нарачка. Тој нуди брз увид во точниот број на купени ставки, бројот на рефундирани билети како и вкупната сума на вратени пари по нарачка без оптоварување на трансакциските табели.
    10161016
    10171017{{{
     
    10551055
    10561056Користењето на под-прашалник ('''Subquery''') за агрегација на `Ticket_Order_Item` е најчист начин за пресметка на `total_items_refunded`. Бидејќи ова е аналитички поглед, тој е дизајниран да ја избегне сложената логика во реално време, па затоа е најдобро да остане непроменет.
     1057
     1058
     1059
     1060
     1061
     1062
     1063
     1064== Анализа и оптимизација на `Venue_Occupancy_Report`
     1065
     1066Овој материјализиран поглед генерира финансиски профил и историја на нарачки за секој корисник, сумирајќи ги направените трошоци на ниво на главна нарачка. Тој нуди брз увид во точниот број на купени ставки, бројот на рефундирани билети како и вкупната сума на вратени пари по нарачка без оптоварување на трансакциските табели.
     1067
     1068{{{
     1069
     1070CREATE MATERIALIZED VIEW "Venue_Occupancy_Report" AS
     1071SELECT e.event_id,
     1072       e.name AS event_name,
     1073       eh.event_happening_id,
     1074       eh.event_time,
     1075       v.name AS venue_name,
     1076       v.number_of_seats AS total_venue_capacity,
     1077       COALESCE(stats.sold_count, 0) AS tickets_sold,
     1078       ROUND((COALESCE(stats.sold_count, 0)::NUMERIC / v.number_of_seats::NUMERIC) * 100, 2) AS occupancy_percentage
     1079FROM "Event" e
     1080JOIN "Event_Happening" eh ON e.event_id = eh.event_id
     1081JOIN "Venue" v ON eh.venue_id = v.venue_id
     1082LEFT JOIN (
     1083    SELECT t.event_happening_id, COUNT(toi.order_item_id) AS sold_count
     1084    FROM "Ticket_Order_Item" toi
     1085    JOIN "Ticket" t ON toi.ticket_id = t.ticket_id
     1086    GROUP BY t.event_happening_id
     1087) stats ON eh.event_happening_id = stats.event_happening_id
     1088GROUP BY e.event_id, e.name, eh.event_happening_id, eh.event_time, v.name, v.number_of_seats, stats.sold_count;
     1089
     1090}}}
     1091
     1092Погледот е веќе најоптимално напишан и не треба да се преуредува.
     1093
     1094==== 1. Примарен филтер:
     1095
     1096`event_happening_id` или `venue_name` (за известување за конкретни локации).
     1097
     1098==== 2. Случај на употреба:
     1099
     1100Бизнис извештаи за менаџерите на објектите за следење на „Occupancy Rate“ (процент на исполнетост) на капацитетите.
     1101
     1102==== 3. Оптимизација:
     1103
     1104Овој поглед прави комплексна математичка пресметка (`sold_count / total_venue_capacity`). Материјализацијата тука е клучна бидејќи пресметката не се извршува при секое барање, туку само кога се освежува погледот.