| Датотека | views/12_customer_contract_menu_view.sql
|
|---|
| Шема | kbnteam
|
|---|
| Категорија | Оперативна поддршка
|
|---|
| Поврзани индекси | Зависи од v_customer_contract_meals и v_customer_contract_drinks
|
|---|
Опис
Го комбинира v_customer_contract_meals и v_customer_contract_drinks во една унифицирана површина за мени. Употребува UNION ALL и дискриминатор item_type ('meal' или 'drink') за разликување на ставките. Колоните се нормализирани: item_id, item_name, item_description, item_price, item_size. Ова е главниот преглед за мени во апликацијата при нарачување.
Важно: Бидејќи овој преглед се базира на два прегледа, неговите перформанси директно зависат од перформансите на v_customer_contract_meals и v_customer_contract_drinks.
Зависности
| Извор | Тип | Опис
|
|---|
kbnteam.v_customer_contract_meals | UNION ALL дел 1 | Оброци под активни договори
|
kbnteam.v_customer_contract_drinks | UNION ALL дел 2 | Пијачи под активни договори
|
Излезни колони
| Колона | Оброци | Пијачи | Опис
|
|---|
customer_user_id | ✓ | ✓ | ID на купувачот
|
company_id | ✓ | ✓ | ID на компанијата
|
company_name | ✓ | ✓ | Назив на компанијата
|
contract_id | ✓ | ✓ | ID на договорот
|
rest_id | ✓ | ✓ | ID на ресторанот
|
rest_name | ✓ | ✓ | Назив на ресторанот
|
item_type | 'meal' | 'drink' | Дискриминатор
|
item_id | meal_id | drink_id | ID на ставката
|
item_name | meal_name | drink_name | Назив на ставката
|
item_description | meal_description | NULL | Опис
|
item_price | meal_price | drink_price | Цена
|
item_size | meal_weight (g) | drink_milliliters (ml) | Величина
|
category_name | cat_name | NULL | Категорија (само оброци)
|
ingredients | текст | '' | Состојки
|
allergens | текст | '' | Алергени
|
SQL Дефиниција
CREATE OR REPLACE VIEW kbnteam.v_customer_contract_menu AS
SELECT
m.customer_user_id,
m.customer_first_name,
m.customer_last_name,
m.customer_email,
m.company_id,
m.company_name,
m.contract_id,
m.rest_id,
m.rest_name,
'meal'::text AS item_type,
m.meal_id AS item_id,
m.meal_name AS item_name,
m.meal_description AS item_description,
m.meal_price AS item_price,
m.meal_weight AS item_size,
m.cat_name AS category_name,
m.ingredients,
m.allergens
FROM kbnteam.v_customer_contract_meals m
UNION ALL
SELECT
d.customer_user_id,
d.customer_first_name,
d.customer_last_name,
d.customer_email,
d.company_id,
d.company_name,
d.contract_id,
d.rest_id,
d.rest_name,
'drink'::text AS item_type,
d.drink_id AS item_id,
d.drink_name AS item_name,
NULL::varchar(255) AS item_description,
d.drink_price AS item_price,
d.drink_milliliters AS item_size,
NULL::varchar(255) AS category_name,
''::text AS ingredients,
''::text AS allergens
FROM kbnteam.v_customer_contract_drinks d;
Тестирање на перформанси
Препорачано тест прашање
SET search_path TO kbnteam;
SET statement_timeout = '60s';
-- Тест 1: по купувач (основен use-case во апликацијата)
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_customer_contract_menu
WHERE customer_user_id = 1;
-- Тест 2: по ресторан
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_customer_contract_menu
WHERE rest_id = 1;
-- Тест 3: само оброци
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_customer_contract_menu
WHERE customer_user_id = 1 AND item_type = 'meal';
Напомена за индекси
Овој преглед нема свои индекси. Перформансите целосно зависат од:
- Индексите на
v_customer_contract_meals (од indexes/v_menu_meal_index.sql)
- Индексите на
v_customer_contract_drinks (од indexes/v_menu_drink_index.sql)
Резултати пред индексирање
| Метрика | Тест 1 (customer) | Тест 2 (rest_id) | Тест 3 (customer+meal)
|
|---|
| Planning Time | _ ms | _ ms | _ ms
|
| Execution Time | _ ms | _ ms | _ ms
|
| Rows Returned | _ | _ | _
|
-- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
Резултати по индексирање
| Метрика | Тест 1 (customer) | Тест 2 (rest_id) | Тест 3 (customer+meal)
|
|---|
| Planning Time | _ ms | _ ms | _ ms
|
| Execution Time | _ ms | _ ms | _ ms
|
| Rows Returned | _ | _ | _
|
-- Излезот од EXPLAIN ANALYZE овде (по индексирање)
Анализа на подобрување
| Метрика | Пред | По | Δ Подобрување
|
|---|
| Execution Time (Тест 1) | _ ms | _ ms | _ %
|
| Execution Time (Тест 2) | _ ms | _ ms | _ %
|
Очекувано: Поголемото подобрување доаѓа од страна на v_customer_contract_meals (CTE агрегации). v_customer_contract_drinks е природно побрз поради поедноставниот JOIN без CTE.