Changes between Version 80 and Version 81 of QueryOptimization


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

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v80 v81  
    972972== Анализа и оптимизација на `Event_Overall_Ratings`
    973973
    974 Овој поглед ја прикажува деталната физичка структура на секој објект (сала), поврзувајќи ги поединечните седишта со нивните сектори и самите локации. Патеката на релациите е поставена линеарно, овозможувајќи брза проверка на точната позиција на седиштето преку неговиот ред и број.
     974Овој материјализиран поглед врши брза статистичка анализа на задоволството на публиката преку пресметување на просечната оцена за секој настан поединечно. Со оглед на тоа што користи агрегациски функции ('''COUNT''' и '''AVG'''), тој е зачуван како материјализиран поглед со цел да се избегне постојано пресметување и да се зачуваат перформансите на базата.
    975975
    976976{{{
     
    10041004
    10051005Овој поглед е оптимално напишан со '''LEFT JOIN''' и '''GROUP BY''', што овозможува агрегација на сите оценки во еден чекор. Не бара индексирање бидејќи податоците се веќе пресметани и зачувани во материјализираната форма.
     1006
     1007
     1008
     1009
     1010
     1011
     1012
     1013== Анализа и оптимизација на `User_Order_History`
     1014
     1015Овој материјализиран поглед врши брза статистичка анализа на задоволството на публиката преку пресметување на просечната оцена за секој настан поединечно. Со оглед на тоа што користи агрегациски функции ('''COUNT''' и '''AVG'''), тој е зачуван како материјализиран поглед со цел да се избегне постојано пресметување и да се зачуваат перформансите на базата.
     1016
     1017{{{
     1018
     1019CREATE MATERIALIZED VIEW "User_Order_History" AS
     1020SELECT u.user_id,
     1021       u.username,
     1022       o.order_id,
     1023       o.order_time,
     1024       o.order_amount,
     1025       COALESCE(items.total_items_ordered, 0) AS total_items_ordered,
     1026       COALESCE(items.total_items_refunded, 0) AS total_items_refunded,
     1027       COALESCE(items.total_amount_refunded, 0.00) AS total_amount_refunded
     1028FROM "User" u
     1029JOIN "Regular_User" ru ON u.user_id = ru.user_id
     1030JOIN "Ticket_Order" o ON ru.user_id = o.user_id
     1031LEFT JOIN (
     1032    SELECT
     1033        toi.order_id,
     1034        COUNT(toi.order_item_id) AS total_items_ordered,
     1035        COUNT(tri.refund_item_id) AS total_items_refunded,
     1036        SUM(COALESCE(tri.item_price, 0.00)) AS total_amount_refunded
     1037    FROM "Ticket_Order_Item" toi
     1038    LEFT JOIN "Ticket_Refund_Item" tri ON toi.order_item_id = tri.order_item_id
     1039    GROUP BY toi.order_id
     1040) items ON o.order_id = items.order_id;
     1041
     1042}}}
     1043
     1044Погледот е веќе најоптимално напишан и не треба да се преуредува.
     1045
     1046==== 1. Примарен филтер:
     1047
     1048`user_id` (за преглед на лична историја на нарачки).
     1049
     1050==== 2. Случај на употреба:
     1051
     1052Овозможување на корисниците да ги видат сите свои минати купувања, како и следење на статусот на рефундациите.
     1053
     1054==== 3. Оптимизација:
     1055
     1056Користењето на под-прашалник ('''Subquery''') за агрегација на `Ticket_Order_Item` е најчист начин за пресметка на `total_items_refunded`. Бидејќи ова е аналитички поглед, тој е дизајниран да ја избегне сложената логика во реално време, па затоа е најдобро да остане непроменет.