= Преглед: 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 Дефиниција == {{{ #!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; }}} == Тестирање на перформанси == === Препорачано тест прашање === {{{ #!sql 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) === {{{ #!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`.