wiki:CustomerContractMenuView

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

--

Преглед: 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 Дефиниција

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;

Тестирање на перформанси

Препорачано тест прашање

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.

Note: See TracWiki for help on using the wiki.