Changes between Version 9 and Version 10 of QueryViewsOptimization


Ignore:
Timestamp:
09/13/26 23:58:24 (13 days ago)
Author:
223235
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryViewsOptimization

    v9 v10  
    11= Оптимизација на прашалници и погледи
     2
     3Оваа страница ги опишува деветте погледи од `Views 2.0` и индексите од `Index 2.0`, усогласени со `schema7.0_dll.sql`.
    24
    35== Погледи
    46
    5 === Menu и Catalog
     7Погледите се креираат по нумеричкиот редослед на SQL датотеките. `v_orders_full` се креира пред `v_driver_deliveries`, бидејќи вториот го користи првиот.
    68
    7 Овие погледи ги откриваат менито на ресторанот за пребарувањ и нарачки базирани на договорот помеѓу ресторанот и фирмата.
     9=== Мени и каталог
    810
    9 ||= Поглед ||= Цел ||= Изворни табели ||= Забелешки ||
    10 || [wiki:MenuMealView v_menu_meal] || Ги листа сите оброци со категорија, ресторан, состојки и алергени || `meal`, `category`, `restaurant`, `meal_ingredient`, `ingredient`, `alergen_ingredient`, `alergen` || Користи CTE табели и string агрегација за листање на состојки/алергени ||
    11 || [wiki:MenuDrinkView v_menu_drink] || Ги листа сите пијалоци со детали за ресторанот || `drink`, `restaurant` || Обичен join поглед без агрегации. ||
     11Овие погледи го прикажуваат менито на рестораните. Самите погледи не ја проверуваат активноста на договорите и не го ограничуваат менито според компанијата на клиентот.
    1212
    13 === Orders и Deliveries
     13||= Поглед ||= Цел ||= Изворни табели / погледи ||= Забелешки ||
     14|| [wiki:MenuMealView v_menu_meal] || Ги прикажува јадењата со категорија, ресторан, состојки и алергени. || `meal_ingredient`, `ingredient`, `alergen_ingredient`, `alergen`, `meal`, `category`, `restaurant` || Двата CTE изрази користат `string_agg(DISTINCT ... ORDER BY ...)`, без вгнездени `SELECT DISTINCT` прашалници. Јадењата без состојки или алергени остануваат во резултатот со празни листи. ||
     15|| [wiki:MenuDrinkView v_menu_drink] || Ги прикажува пијалоците, нивната количина и цена, како и ресторанот. || `drink`, `restaurant` || Едноставно спојување на `drink` и `restaurant`, без агрегации. ||
    1416
    15 Овие погледи се основните оперативни погледи за креирање нарачки преку веб апликацијата.
     17=== Нарачки и достави
    1618
    17 ||= Поглед ||= Цел ||= Изворни табели ||= Забелешки ||
    18 || [wiki:OrdersFullView v_orders_full] || Покажува целосни детали за една нарачка, контекст заз купувач/компанија, достава и нарачани предмети. || `customer_order`, `company_order`, `customer`, `api_user`, `company`, `delivery`, `delivery_status`, `driver`, `order_status`, `order_meal`, `order_drink`, `meal`, `drink` || Користи CTE табели за да агрегира нарачани оброци и пијалоци во читливи листи ||
    19 || [wiki:DriverDeliveriesView v_driver_deliveries] || Покажува назначени достави за возачи и соодветните нарачки || `delivery`, `delivery_status`, `driver`, `api_user`, `restaurant`, `company_order`, `company`, `customer_order`, `customer`, `order_meal`, `order_drink`, `meal`, `drink` || Го користи истиот шаблон за агрегирање на елементи од нарачката како и `v_orders_full` ||
     19Овие погледи служат за преглед и следење на нарачките и доставите.
    2020
     21||= Поглед ||= Цел ||= Изворни табели / погледи ||= Забелешки ||
     22|| [wiki:OrdersFullView v_orders_full] || Прикажува нарачки со податоци за клиентот, компанијата, статусот, доставата и нарачаните јадења и пијалоци. || `order_meal`, `meal`, `order_drink`, `drink`, `customer_order`, `order_status`, `customer`, `api_user`, `company_order`, `company`, `delivery`, `delivery_status` || Списоците се добиваат со `string_agg(DISTINCT ... ORDER BY ...)`. Податоците за доставувачот се земаат директно од `api_user` преку `delivery.driver_user_id`; нема посебно спојување со `driver`. Се задржуваат нарачките без достава. ||
     23|| [wiki:DriverDeliveriesView v_driver_deliveries] || Ги прикажува доставите, доставувачите, рестораните, компаниите и поврзаните нарачки. || `delivery`, `delivery_status`, `driver`, `api_user`, `restaurant`, `company_order`, `company`, `v_orders_full` || Го користи `v_orders_full` за деталите за клиентот и списоците со јадења и пијалоци. `LEFT JOIN` ги задржува и доставите без доставувач, компаниска нарачка или клиентски нарачки. ||
    2124
    22 === Reviews
     25=== Рецензии
    2326
    24 Овој поглед ги спојува двата поттипа на review во еден извештај.
     27Оцените за нарачки и достави се обединуваат во заеднички извештај.
    2528
    26 ||= Поглед ||= Цел ||= Изворни табели ||= Забелешки ||
    27 || [wiki:ReviewsFullView v_reviews_full] || Дава унифициран извештај за оценки на нарачки и достави. || `review`, `order_review`, `delivery_review`, `customer_order`, `delivery`, `company_order`, `customer`, `driver`, `api_user`, `company` || Користи `UNION ALL` да ги комбинира двата дела од извештајот ||
     29||= Поглед ||= Цел ||= Изворни табели / погледи ||= Забелешки ||
     30|| [wiki:ReviewsFullView v_reviews_full] || Ги обединува оцените за нарачки и достави, со ознака за типот на рецензијата. || `review`, `order_review`, `customer_order`, `api_user`, `company_order`, `company`, `delivery_review`, `delivery` || Користи `UNION ALL`. Отстранети се посредните спојувања со `customer` и `driver`; корисничките податоци се земаат директно од `api_user`. Ако една рецензија има записи во двата поттипа, се прикажуваат двата записа. ||
    2831
     32=== Договори, фактурирање и лојалност
    2933
    30 === Contracts, Billing и Loyalty
     34Овие погледи обезбедуваат статистика за компаниите, договорите, фактурите и клиентите.
    3135
    32 Овие погледи поддржуваат креирање извештаи на ниво на компанија.
     36||= Поглед ||= Цел ||= Изворни табели / погледи ||= Забелешки ||
     37|| [wiki:ContractsRevenueView v_contracts_revenue] || За секој договор ги прикажува бројот на компаниски и клиентски нарачки и вкупниот приход за парот компанија–ресторан. || `order_meal`, `meal`, `order_drink`, `drink`, `customer_order`, `company_order`, `contract`, `company`, `restaurant`, `contract_status` || `UNION` ги отстранува повторувањата на парот нарачка–ресторан. Нема филтер за активен договор, датум или статус на нарачка. Целиот износ на нарачката се брои кај секој вклучен ресторан, а истата статистика се повторува кај договорите за истиот пар компанија–ресторан. ||
     38|| [wiki:CompanyBillingOverviewView v_company_billing_overview] || За секоја фактура ги прикажува компанијата, доставата, бројот на клиентски нарачки, нивниот вкупен износ и бројот на договори на компанијата. || `contract`, `invoice`, `company_order`, `company`, `customer_order` || Износот и бројот на нарачки се пресметуваат во главниот прашалник. Договорите се бројат во посебен CTE за да не го умножат износот. Фактурите без клиентски нарачки имаат број и износ еднакви на нула. ||
     39|| [wiki:CustomerLoyaltyFullView v_customer_loyalty_full_v2] || Ги прикажува клиентот, компанијата, поените, статусот и нивото на лојалност, бројот на нарачки, вкупната потрошувачка и датумот на последната нарачка. || `customer_order`, `customer_loyalty`, `customer`, `company`, `api_user`, `customer_loyalty_status`, `loyalty_tier` || CTE изразот `order_stats` пресметува `COUNT`, `SUM` и `MAX` по клиент. Статистиката ги опфаќа сите статуси на нарачки. Се прикажуваат клиентите со запис во `customer_loyalty`, вклучувајќи ги и оние без нарачки. ||
    3340
    34 ||= Поглед ||= Цел ||= Изворни табели ||= Забелешки ||
    35 || [wiki:ContractsRevenueView v_contracts_revenue] || Го сумаризира приходот по компанија и ресторан за активните договори. || `contract`, `company`, `restaurant`, `contract_status`, `customer_order`, `company_order`, `order_meal`, `order_drink`, `meal`, `drink` || Користи restaurant-by-order CTE табела да ги мапира измешаните нарачки назад до ресторанот ||
    36 || [wiki:CompanyBillingOverviewView v_company_billing_overview] || Покажува салдо од фактури, број на нарачки по customer и број на компаниски договори. || `invoice`, `company_order`, `customer_order`, `contract`, `company` || Користи CTE табели за број на договори на компанија и салдо од фактури. ||
    37 || [wiki:CustomerLoyaltyFullView v_customer_loyalty_full_v2] || Го покажува статусот на лојалност (loyalty status), информации за ниво (tier) и статистика за нарачки на еден муштерија. || `customer_loyalty`, `customer`, `company`, `api_user`, `customer_loyalty_status`, `loyalty_tier`, `customer_order` || / ||
     41=== Термини за ручек
    3842
    39 === Operational Support
     43Погледот го поврзува распоредот за ручек со доставувачите на соодветниот ресторан.
    4044
    41 Овие погледи поддржуваат internal routing, scheduling, и shared company membership pages.
    42 
    43 ||= Поглед ||= Цел ||= Изворни табели ||= Забелешки ||
    44 || [wiki:DriverLunchTimersView v_driver_lunch_timers] || Ги листа распоредите за ручек за возачи, договори и компании. || `lunch_time`, `contract`, `company`, `restaurant`, `driver`, `api_user` || Најдобро за неделно распоредување и потсетници за возачите. ||
     45||= Поглед ||= Цел ||= Изворни табели / погледи ||= Забелешки ||
     46|| [wiki:DriverLunchTimersView v_driver_lunch_timers] || Ги поврзува термините за ручек со договорите, компаниите, рестораните и доставувачите. || `lunch_time`, `contract`, `company`, `restaurant`, `driver`, `api_user` || Се добива ред за секој термин и секој доставувач на ресторанот. Погледот не го ограничува резултатот на назначениот доставувач и не филтрира активни договори или денови. Термините за ресторани без доставувачи не се прикажуваат. ||
    4547
    4648== Индекси
    4749
    48 === Menu индекси
     50Индексите се поставуваат врз изворните табели, бидејќи овие погледи не се материјализирани. Деветте датотеки во `Index 2.0` содржат вкупно 14 различни дефиниции на индекси. Заедничките индекси се дефинирани само еднаш. Датотеките за менито со пијалоци, рецензиите и фактурирањето содржат објаснувања за постојните и заедничките индекси, без нови `CREATE INDEX` наредби.
    4951
    50 ||= Датотека на индекс ||= Индекси ||= Поддржани погледи ||= Забелешки ||
    51 || [wiki:MenuMealIndex indexes/v_menu_meal_index.sql] || `meal(cat_id, meal_id)`, `meal_ingredient(meal_id, ingr_id)`, `alergen_ingredient(ingr_id, alergen_id)` || `v_menu_meal` and `v_customer_contract_meals` || Поддржува спојувања на category и надоградување на ingredient/allergen. ||
     52Дефинициите користат `CREATE INDEX IF NOT EXISTS`. Оваа проверка е по име и не ја менува дефиницијата на веќе постоен индекс со исто име. Индексите од `PRIMARY KEY` и `UNIQUE` ограничувањата остануваат дел од шемата.
    5253
    53 === Order и Delivery индекси
     54=== Индекси за мени
    5455
    55 ||= Датотека на индекс ||= Индекси ||= Поддржани погледи ||= Забелешки ||
    56 || [wiki:OrdersFullIndex indexes/v_orders_full_index.sql] || `customer_order(comp_order_id)`, `customer_order(customer_user_id, order_datetime DESC)`, `delivery(driver_user_id, delivery_date)`, `order_meal(order_id, meal_id)`, `order_drink(order_id, drink_id)` || `v_orders_full`, `v_driver_deliveries`, `v_contracts_revenue`, `v_company_billing_overview`, `v_reviews_full` || Поддржува пребарување на нарачки, филтрирање на достави и агрегација на елементи на нарачка. ||
    57 || [wiki:DriverDeliveriesIndex indexes/v_driver_deliveries_index.sql] || `delivery(driver_user_id, delivery_date)`, `order_meal(order_id, meal_id)`, `order_drink(order_id, drink_id)`, `customer_order(comp_order_id)` || `v_driver_deliveries` || Креирано за пребарување на достави од страна на доставувачи. ||
    58 || [wiki:ReviewsFullIndex indexes/v_reviews_full_index.sql] || `customer_order(comp_order_id)` || `v_reviews_full` || Погледот за review во главно зависи од заедничките нарачки и доставувања. ||
     56||= Датотека на индекс ||= Индекси дефинирани во датотеката ||= Поддржани погледи ||= Забелешки ||
     57|| [wiki:MenuMealIndex Index 2.0/02_v_menu_meal_index.sql] || `meal(cat_id, meal_id)`, `meal_ingredient(meal_id, ingr_id)`, `alergen_ingredient(ingr_id, alergen_id)` || `v_menu_meal` || Ги поддржува пребарувањето по категорија и врските јадење–состојки–алергени. `meal(rest_id, meal_name)` веќе е покриен со `UNIQUE`. ||
     58|| `Index 2.0/01_v_menu_drink_index.sql` || Нема нови дефиниции || `v_menu_drink` || Нема дополнителен индекс. `restaurant(rest_id)` е примарен клуч, а `drink(rest_id, drink_name)` веќе има `UNIQUE` индекс. ||
    5959
    60 === Contract, Billing, Loyalty, и Scheduling индекси
     60=== Индекси за нарачки, достави и рецензии
    6161
    62 ||= Датотека на индекс ||= Индекси ||= Поддржани погледи ||= Забелешки ||
    63 || [wiki:ContractsRevenueIndex indexes/v_contracts_revenue_index.sql] || `order_meal(order_id, meal_id)`, `order_drink(order_id, drink_id)`, `customer_order(comp_order_id)`, `contract(company_id, rest_id)` || `v_contracts_revenue` || Поддржува агрегација за приход по договор по компанија и ресторан. ||
    64 || [wiki:CompanyBillingOverviewIndex indexes/v_company_billing_overview_index.sql] || `contract(company_id)`, `customer_order(comp_order_id)` || `v_company_billing_overview` || Помага на прегледот за наплаќање по договори и салдо на фактурите. ||
    65 || [wiki:CustomerLoyaltyFullIndex indexes/v_customer_loyalty_full_v2_index.sql] || `customer_order(customer_user_id, order_datetime DESC)` || `v_customer_loyalty_full_v2` || Поддржува статистики latest-order и aggregate-order за извештаи за лојалност. ||
    66 || [wiki:DriverLunchTimersIndex indexes/v_driver_lunch_timers_index.sql] || `lunch_time(lunch_weekday, contract_id)`, `driver(rest_id)`, `contract(rest_id, company_id)` || `v_driver_lunch_timers` || Поддржува неделно филтрирање и рутирање restaurant/contract. ||
     62||= Датотека на индекс ||= Индекси дефинирани во датотеката ||= Поддржани погледи ||= Забелешки ||
     63|| [wiki:OrdersFullIndex Index 2.0/03_v_orders_full_index.sql] || `company_order(company_id)`, `customer_order(comp_order_id)`, `order_meal(order_id, meal_id)`, `order_drink(order_id, drink_id)` || `v_orders_full`, `v_driver_deliveries`, `v_contracts_revenue`, `v_company_billing_overview`, `v_reviews_full` || Заеднички индекси за пронаоѓање компаниски и клиентски нарачки и за поврзување на јадењата и пијалоците по нарачка. Индексите по доставувач и клиент се дефинирани во датотеките 05 и 07. ||
     64|| [wiki:DriverDeliveriesIndex Index 2.0/05_v_driver_deliveries_index.sql] || `delivery(driver_user_id, delivery_date)` || `v_driver_deliveries`, `v_orders_full`, `v_reviews_full` || Пребарување по доставувач и датум. Ги користи и индексите од датотека 03; индексот за `driver(rest_id)` е во датотека 08. ||
     65|| [wiki:ReviewsFullIndex Index 2.0/04_v_reviews_full_index.sql] || Нема нови дефиниции || `v_reviews_full` || Нема дополнителен индекс. Врските преку `review_id`, `order_id` и `delivery_id` се покриени со примарни и уникатни клучеви. Се користат и заедничките индекси од датотеките 03, 05 и 07. ||
     66
     67=== Индекси за договори, фактурирање, лојалност и термини
     68
     69||= Датотека на индекс ||= Индекси дефинирани во датотеката ||= Поддржани погледи ||= Забелешки ||
     70|| [wiki:ContractsRevenueIndex Index 2.0/06_v_contracts_revenue_index.sql] || `contract(company_id, rest_id)` || `v_contracts_revenue`, `v_company_billing_overview` || Водечката колона `company_id` поддржува и групирање на договорите за фактурирање. Не се додава посебен индекс само на `contract(company_id)`. Индексите за нарачките се во датотека 03. ||
     71|| [wiki:CompanyBillingOverviewIndex Index 2.0/09_v_company_billing_overview_index.sql] || Нема нови дефиниции || `v_company_billing_overview` || Нема дополнителен индекс. Ги користи `company_order(company_id)` и `customer_order(comp_order_id)` од датотека 03 и `contract(company_id, rest_id)` од датотека 06. `invoice(comp_order_id)` веќе има `UNIQUE` индекс. ||
     72|| [wiki:CustomerLoyaltyFullIndex Index 2.0/07_v_customer_loyalty_full_v2_index.sql] || `customer_order(customer_user_id, order_datetime DESC)`, `customer(company_id)` || `v_customer_loyalty_full_v2`, `v_orders_full` || Пребарување на нарачки по клиент и датум и на клиенти по компанија. `customer_loyalty(user_id)` веќе има `UNIQUE` индекс. За сумата на потрошувачката и натаму се чита `order_total`. ||
     73|| [wiki:DriverLunchTimersIndex Index 2.0/08_v_driver_lunch_timers_index.sql] || `driver(rest_id)`, `contract(rest_id, company_id)`, `lunch_time(contract_id)` || `v_driver_lunch_timers`, `v_driver_deliveries`; пребарување договори по ресторан во `v_contracts_revenue` || Ги поддржува врските ресторан–доставувач, ресторан–договор и договор–термин. Индексот на `lunch_time` започнува со `contract_id`, па не бара филтер по ден. ||
     74
     75== Тестирање на базата пред користење на индексите
     76
     77Овој дел е оставен за мерењата пред додавање на дополнителните индекси од `Index 2.0`. Во основната состојба остануваат индексите создадени со `PRIMARY KEY` и `UNIQUE`. Ако претходно се применети дополнителните индекси од `index/`, тие треба да се евидентираат; таквото мерење не претставува основна состојба без дополнителни индекси.
     78
     79=== Податоци и услови за тестирање
     80
     81[Да се внесат верзијата на PostgreSQL, бројот на записи, постојните индекси, условите за кеширање, состојбата на статистиките и бројот на повторувања.]
     82
     83=== Прашалници и планови за извршување
     84
     85[Простор за SQL прашалници со конкретни филтри, излез од `EXPLAIN (ANALYZE, BUFFERS)` и слики од тестирањето.]
     86
     87=== Резултати пред индексите
     88
     89||= Поглед ||= Прашалник / филтер ||= Време на извршување (ms) ||= План / buffers / забелешки ||
     90|| `v_menu_drink` ||  ||  ||  ||
     91|| `v_menu_meal` ||  ||  ||  ||
     92|| `v_orders_full` ||  ||  ||  ||
     93|| `v_reviews_full` ||  ||  ||  ||
     94|| `v_driver_deliveries` ||  ||  ||  ||
     95|| `v_contracts_revenue` ||  ||  ||  ||
     96|| `v_customer_loyalty_full_v2` ||  ||  ||  ||
     97|| `v_driver_lunch_timers` ||  ||  ||  ||
     98|| `v_company_billing_overview` ||  ||  ||  ||
     99
     100== Тестирање на базата по користење на индексите
     101
     102Овој дел е оставен за мерењата по примената на индексите од `Index 2.0`. Се користат истите податоци, прашалници, филтри, услови за кеширање и број на повторувања како во претходниот дел, со ажурирани статистики за табелите во двете состојби.
     103
     104=== Применети индекси
     105
     106[Простор за список на индексите што навистина се присутни во базата и потврда за применетите SQL датотеки.]
     107
     108=== Прашалници и планови за извршување
     109
     110[Простор за истиот сет SQL прашалници, излез од `EXPLAIN (ANALYZE, BUFFERS)` и слики од тестирањето.]
     111
     112=== Резултати по индексите
     113
     114||= Поглед ||= Прашалник / филтер ||= Време на извршување (ms) ||= План / buffers / забелешки ||
     115|| `v_menu_drink` ||  ||  ||  ||
     116|| `v_menu_meal` ||  ||  ||  ||
     117|| `v_orders_full` ||  ||  ||  ||
     118|| `v_reviews_full` ||  ||  ||  ||
     119|| `v_driver_deliveries` ||  ||  ||  ||
     120|| `v_contracts_revenue` ||  ||  ||  ||
     121|| `v_customer_loyalty_full_v2` ||  ||  ||  ||
     122|| `v_driver_lunch_timers` ||  ||  ||  ||
     123|| `v_company_billing_overview` ||  ||  ||  ||
     124
     125=== Споредба и заклучок
     126
     127[Простор за споредба на времињата, плановите и прочитаните блокови пред и по индексите. Да се евидентираат и прашалниците кај кои нема подобрување. Изборот на индекс зависи од податоците и филтрите; целосните прегледи и агрегации можат да користат секвенцијално читање.]