Преглед: 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;
Применети индекси (од v_menu_drink_index.sql)
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.
Last modified
2 weeks ago
Last modified on 05/10/26 14:38:31
Note:
See TracWiki
for help on using the wiki.
