= Преглед: v_customer_contract_menu = ||= Датотека ||= `views/12_customer_contract_menu_view.sql` || ||= Шема ||= `kbnteam` || ||= Категорија ||= Оперативна поддршка || ||= Поврзани индекси ||= Зависи од `v_customer_contract_meals` и `v_customer_contract_drinks` || == Опис == Го комбинира `v_customer_contract_meals` и `v_customer_contract_drinks` во една унифицирана површина за мени. Употребува `UNION ALL` и дискриминатор `item_type` ('meal' или 'drink') за разликување на ставките. Колоните се нормализирани: `item_id`, `item_name`, `item_description`, `item_price`, `item_size`. Ова е главниот преглед за мени во апликацијата при нарачување. '''Важно:''' Бидејќи овој преглед се базира на два прегледа, неговите перформанси директно зависат од перформансите на `v_customer_contract_meals` и `v_customer_contract_drinks`. == Зависности == ||= Извор ||= Тип ||= Опис || || `kbnteam.v_customer_contract_meals` || UNION ALL дел 1 || Оброци под активни договори || || `kbnteam.v_customer_contract_drinks` || UNION ALL дел 2 || Пијачи под активни договори || == Излезни колони == ||= Колона ||= Оброци ||= Пијачи ||= Опис || || `customer_user_id` || ✓ || ✓ || ID на купувачот || || `company_id` || ✓ || ✓ || ID на компанијата || || `company_name` || ✓ || ✓ || Назив на компанијата || || `contract_id` || ✓ || ✓ || ID на договорот || || `rest_id` || ✓ || ✓ || ID на ресторанот || || `rest_name` || ✓ || ✓ || Назив на ресторанот || || `item_type` || `'meal'` || `'drink'` || Дискриминатор || || `item_id` || `meal_id` || `drink_id` || ID на ставката || || `item_name` || `meal_name` || `drink_name` || Назив на ставката || || `item_description` || `meal_description` || NULL || Опис || || `item_price` || `meal_price` || `drink_price` || Цена || || `item_size` || `meal_weight` (g) || `drink_milliliters` (ml) || Величина || || `category_name` || `cat_name` || NULL || Категорија (само оброци) || || `ingredients` || текст || `''` || Состојки || || `allergens` || текст || `''` || Алергени || == SQL Дефиниција == {{{ #!sql CREATE OR REPLACE VIEW kbnteam.v_customer_contract_menu AS SELECT m.customer_user_id, m.customer_first_name, m.customer_last_name, m.customer_email, m.company_id, m.company_name, m.contract_id, m.rest_id, m.rest_name, 'meal'::text AS item_type, m.meal_id AS item_id, m.meal_name AS item_name, m.meal_description AS item_description, m.meal_price AS item_price, m.meal_weight AS item_size, m.cat_name AS category_name, m.ingredients, m.allergens FROM kbnteam.v_customer_contract_meals m UNION ALL SELECT d.customer_user_id, d.customer_first_name, d.customer_last_name, d.customer_email, d.company_id, d.company_name, d.contract_id, d.rest_id, d.rest_name, 'drink'::text AS item_type, d.drink_id AS item_id, d.drink_name AS item_name, NULL::varchar(255) AS item_description, d.drink_price AS item_price, d.drink_milliliters AS item_size, NULL::varchar(255) AS category_name, ''::text AS ingredients, ''::text AS allergens FROM kbnteam.v_customer_contract_drinks d; }}} == Тестирање на перформанси == === Препорачано тест прашање === {{{ #!sql SET search_path TO kbnteam; SET statement_timeout = '60s'; -- Тест 1: по купувач (основен use-case во апликацијата) EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_customer_contract_menu WHERE customer_user_id = 1; -- Тест 2: по ресторан EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_customer_contract_menu WHERE rest_id = 1; -- Тест 3: само оброци EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_customer_contract_menu WHERE customer_user_id = 1 AND item_type = 'meal'; }}} === Напомена за индекси === Овој преглед нема свои индекси. Перформансите целосно зависат од: * Индексите на `v_customer_contract_meals` (од `indexes/v_menu_meal_index.sql`) * Индексите на `v_customer_contract_drinks` (од `indexes/v_menu_drink_index.sql`) === Резултати пред индексирање === ||= Метрика ||= Тест 1 (customer) ||= Тест 2 (rest_id) ||= Тест 3 (customer+meal) || || Planning Time || ___ ms || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || ___ ms || || Rows Returned || ___ || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) }}} === Резултати по индексирање === ||= Метрика ||= Тест 1 (customer) ||= Тест 2 (rest_id) ||= Тест 3 (customer+meal) || || Planning Time || ___ ms || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || ___ ms || || Rows Returned || ___ || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (по индексирање) }}} === Анализа на подобрување === ||= Метрика ||= Пред ||= По ||= Δ Подобрување || || Execution Time (Тест 1) || ___ ms || ___ ms || ___ % || || Execution Time (Тест 2) || ___ ms || ___ ms || ___ % || '''Очекувано:''' Поголемото подобрување доаѓа од страна на `v_customer_contract_meals` (CTE агрегации). `v_customer_contract_drinks` е природно побрз поради поедноставниот JOIN без CTE.