| | 1 | = Преглед: v_customer_contract_drinks = |
| | 2 | |
| | 3 | ||= Датотека ||= `views/11_customer_contract_drinks_view.sql` || |
| | 4 | ||= Шема ||= `kbnteam` || |
| | 5 | ||= Категорија ||= Оперативна поддршка || |
| | 6 | ||= Поврзани индекси ||= Ги користи индексите од `indexes/v_menu_drink_index.sql` || |
| | 7 | |
| | 8 | == Опис == |
| | 9 | Ги наведува пијачите достапни на купувач под активни договори. Применува ист шаблон за филтрирање на активни договори и тековни датуми на договори, но без CTE агрегации бидејќи пијачите немаат состојки или алергени. Се користи директно во апликацијата и преку `v_customer_contract_menu`. |
| | 10 | |
| | 11 | '''Клучни филтри:''' |
| | 12 | * `contract_status_name = 'active'` (case-insensitive) |
| | 13 | * `CURRENT_DATE BETWEEN contract_start_date AND contract_end_date` |
| | 14 | |
| | 15 | == Зависности == |
| | 16 | ||= Табела ||= Тип на употреба || |
| | 17 | || `kbnteam.customer` || Главна табела || |
| | 18 | || `kbnteam.api_user` || JOIN — детали за купувачот || |
| | 19 | || `kbnteam.company` || JOIN — компанија || |
| | 20 | || `kbnteam.contract` || JOIN — договор || |
| | 21 | || `kbnteam.contract_status` || JOIN — статус (филтер: 'active') || |
| | 22 | || `kbnteam.restaurant` || JOIN — ресторан || |
| | 23 | || `kbnteam.drink` || JOIN — пијачи на ресторанот || |
| | 24 | |
| | 25 | == SQL Дефиниција == |
| | 26 | {{{ |
| | 27 | #!sql |
| | 28 | CREATE OR REPLACE VIEW kbnteam.v_customer_contract_drinks AS |
| | 29 | SELECT |
| | 30 | cu.user_id AS customer_user_id, |
| | 31 | au.user_first_name AS customer_first_name, |
| | 32 | au.user_last_name AS customer_last_name, |
| | 33 | au.user_email AS customer_email, |
| | 34 | cu.company_id, |
| | 35 | cmp.company_name, |
| | 36 | ct.contract_id, |
| | 37 | r.rest_id, |
| | 38 | r.rest_name, |
| | 39 | d.drink_id, |
| | 40 | d.drink_name, |
| | 41 | d.drink_milliliters, |
| | 42 | d.drink_price |
| | 43 | FROM kbnteam.customer cu |
| | 44 | JOIN kbnteam.api_user au ON au.user_id = cu.user_id |
| | 45 | JOIN kbnteam.company cmp ON cmp.company_id = cu.company_id |
| | 46 | JOIN kbnteam.contract ct ON ct.company_id = cu.company_id |
| | 47 | JOIN kbnteam.contract_status cs ON cs.contract_status_id = ct.contract_status_id |
| | 48 | JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id |
| | 49 | JOIN kbnteam.drink d ON d.rest_id = r.rest_id |
| | 50 | WHERE lower(cs.contract_status_name) = 'active' |
| | 51 | AND CURRENT_DATE BETWEEN ct.contract_start_date AND ct.contract_end_date; |
| | 52 | }}} |
| | 53 | |
| | 54 | == Тестирање на перформанси == |
| | 55 | |
| | 56 | === Препорачано тест прашање === |
| | 57 | {{{ |
| | 58 | #!sql |
| | 59 | SET search_path TO kbnteam; |
| | 60 | SET statement_timeout = '60s'; |
| | 61 | |
| | 62 | -- Тест 1: по купувач |
| | 63 | EXPLAIN (ANALYZE, BUFFERS, VERBOSE) |
| | 64 | SELECT * FROM kbnteam.v_customer_contract_drinks |
| | 65 | WHERE customer_user_id = 1; |
| | 66 | |
| | 67 | -- Тест 2: по ресторан |
| | 68 | EXPLAIN (ANALYZE, BUFFERS, VERBOSE) |
| | 69 | SELECT * FROM kbnteam.v_customer_contract_drinks |
| | 70 | WHERE rest_id = 1; |
| | 71 | }}} |
| | 72 | |
| | 73 | === Применети индекси (од v_menu_drink_index.sql) === |
| | 74 | {{{ |
| | 75 | #!sql |
| | 76 | CREATE INDEX IF NOT EXISTS idx_drink_rest_id_drink_id |
| | 77 | ON kbnteam.drink (rest_id, drink_id); |
| | 78 | }}} |
| | 79 | |
| | 80 | === Резултати пред индексирање === |
| | 81 | ||= Метрика ||= Тест 1 (customer) ||= Тест 2 (rest_id) || |
| | 82 | || Planning Time || ___ ms || ___ ms || |
| | 83 | || Execution Time || ___ ms || ___ ms || |
| | 84 | || Rows Returned || ___ || ___ || |
| | 85 | || drink scan || ___ || ___ || |
| | 86 | |
| | 87 | {{{ |
| | 88 | -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) |
| | 89 | }}} |
| | 90 | |
| | 91 | === Резултати по индексирање === |
| | 92 | ||= Метрика ||= Тест 1 (customer) ||= Тест 2 (rest_id) || |
| | 93 | || Planning Time || ___ ms || ___ ms || |
| | 94 | || Execution Time || ___ ms || ___ ms || |
| | 95 | || Rows Returned || ___ || ___ || |
| | 96 | || drink scan || ___ || ___ || |
| | 97 | |
| | 98 | {{{ |
| | 99 | -- Излезот од EXPLAIN ANALYZE овде (по индексирање) |
| | 100 | }}} |
| | 101 | |
| | 102 | === Анализа на подобрување === |
| | 103 | ||= Метрика ||= Пред ||= По ||= Δ Подобрување || |
| | 104 | || Execution Time (Тест 2) || ___ ms || ___ ms || ___ % || |
| | 105 | |
| | 106 | '''Очекувано:''' `idx_drink_rest_id_drink_id` го помага JOIN-от на пијачи по ресторан. Поедноставната структура (без CTE) прави овој преглед значително побрз од `v_customer_contract_meals`. |