Преглед: v_customer_contract_drinks
| Датотека | views/11_customer_contract_drinks_view.sql
|
|---|
| Шема | kbnteam
|
|---|
| Категорија | Оперативна поддршка
|
|---|
| Поврзани индекси | Ги користи индексите од indexes/v_menu_drink_index.sql
|
|---|
Опис
Ги наведува пијачите достапни на купувач под активни договори. Применува ист шаблон за филтрирање на активни договори и тековни датуми на договори, но без CTE агрегации бидејќи пијачите немаат состојки или алергени. Се користи директно во апликацијата и преку v_customer_contract_menu.
Клучни филтри:
contract_status_name = 'active' (case-insensitive)
CURRENT_DATE BETWEEN contract_start_date AND contract_end_date
Зависности
| Табела | Тип на употреба
|
|---|
kbnteam.customer | Главна табела
|
kbnteam.api_user | JOIN — детали за купувачот
|
kbnteam.company | JOIN — компанија
|
kbnteam.contract | JOIN — договор
|
kbnteam.contract_status | JOIN — статус (филтер: 'active')
|
kbnteam.restaurant | JOIN — ресторан
|
kbnteam.drink | JOIN — пијачи на ресторанот
|
SQL Дефиниција
CREATE OR REPLACE VIEW kbnteam.v_customer_contract_drinks AS
SELECT
cu.user_id AS customer_user_id,
au.user_first_name AS customer_first_name,
au.user_last_name AS customer_last_name,
au.user_email AS customer_email,
cu.company_id,
cmp.company_name,
ct.contract_id,
r.rest_id,
r.rest_name,
d.drink_id,
d.drink_name,
d.drink_milliliters,
d.drink_price
FROM kbnteam.customer cu
JOIN kbnteam.api_user au ON au.user_id = cu.user_id
JOIN kbnteam.company cmp ON cmp.company_id = cu.company_id
JOIN kbnteam.contract ct ON ct.company_id = cu.company_id
JOIN kbnteam.contract_status cs ON cs.contract_status_id = ct.contract_status_id
JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id
JOIN kbnteam.drink d ON d.rest_id = r.rest_id
WHERE lower(cs.contract_status_name) = 'active'
AND CURRENT_DATE BETWEEN ct.contract_start_date AND ct.contract_end_date;
Тестирање на перформанси
Препорачано тест прашање
SET search_path TO kbnteam;
SET statement_timeout = '60s';
-- Тест 1: по купувач
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_customer_contract_drinks
WHERE customer_user_id = 1;
-- Тест 2: по ресторан
EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_customer_contract_drinks
WHERE rest_id = 1;
CREATE INDEX IF NOT EXISTS idx_drink_rest_id_drink_id
ON kbnteam.drink (rest_id, drink_id);
Резултати пред индексирање
| Метрика | Тест 1 (customer) | Тест 2 (rest_id)
|
|---|
| Planning Time | _ ms | _ ms
|
| Execution Time | _ ms | _ ms
|
| Rows Returned | _ | _
|
| drink scan | _ | _
|
-- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
Резултати по индексирање
| Метрика | Тест 1 (customer) | Тест 2 (rest_id)
|
|---|
| Planning Time | _ ms | _ ms
|
| Execution Time | _ ms | _ ms
|
| Rows Returned | _ | _
|
| drink scan | _ | _
|
-- Излезот од EXPLAIN ANALYZE овде (по индексирање)
Анализа на подобрување
| Метрика | Пред | По | Δ Подобрување
|
|---|
| Execution Time (Тест 2) | _ ms | _ ms | _ %
|
Очекувано: idx_drink_rest_id_drink_id го помага JOIN-от на пијачи по ресторан. Поедноставната структура (без CTE) прави овој преглед значително побрз од v_customer_contract_meals.