wiki:CustomerContractDrinksView

Version 1 (modified by 185022, 2 weeks ago) ( diff )

--

Преглед: 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.

Note: See TracWiki for help on using the wiki.