= Преглед: v_customer_loyalty_full_v2 = ||= Датотека ||= `views/06_customer_loyalty_view_v2.sql` || ||= Шема ||= `kbnteam` || ||= Категорија ||= Договори, Фактурирање и Верност || ||= Поврзани индекси ||= `indexes/v_customer_loyalty_full_v2_index.sql` || ||= Статус ||= '''Канонска верзија''' — препорачана за употреба наместо `v_customer_loyalty_full` || == Опис == Прикажува статус на верност, податоци за ниво и статистика на нарачки на купувачи. Користи CTE `order_stats` за агрегирање на вкупен приход, број на нарачки и последна нарачка по купувач. V2 верзијата е почиста и поефикасна од `v_customer_loyalty_full` бидејќи CTE-то е поделено наместо вградено подпрашање. == Зависности == ||= Табела ||= Тип на употреба || || `kbnteam.customer_loyalty` || Главна табела || || `kbnteam.customer` || JOIN — купувач || || `kbnteam.company` || JOIN — компанија || || `kbnteam.api_user` || JOIN — детали за корисник || || `kbnteam.customer_loyalty_status` || JOIN — статус на верност || || `kbnteam.loyalty_tier` || JOIN — ниво на верност || || `kbnteam.customer_order` || LEFT JOIN (CTE) — статистика на нарачки || == SQL Дефиниција == {{{ #!sql CREATE OR REPLACE VIEW kbnteam.v_customer_loyalty_full_v2 AS WITH order_stats AS ( SELECT o.customer_user_id, COUNT(*) AS order_count, COALESCE(SUM(o.order_total), 0)::numeric(14,2) AS total_spent, MAX(o.order_datetime) AS last_order_at FROM kbnteam.customer_order o GROUP BY o.customer_user_id ) SELECT cl.cus_loyalty_id, cl.user_id AS customer_user_id, cu.company_id, cmp.company_name, au.user_first_name, au.user_last_name, au.user_email, au.user_phone_no, cl.cus_loyalty_curr_points, cl.cus_loyalty_joined_at, cls.cus_loyalty_status_id, cls.cus_loyalty_status_name, lt.tier_id, lt.tier_name, lt.tier_discount_percentage, lt.tier_free_delivery_eligibility, lt.tier_priority_support, COALESCE(os.order_count, 0) AS order_count, COALESCE(os.total_spent, 0)::numeric(14,2) AS total_spent, os.last_order_at FROM kbnteam.customer_loyalty cl JOIN kbnteam.customer cu ON cu.user_id = cl.user_id JOIN kbnteam.company cmp ON cmp.company_id = cu.company_id JOIN kbnteam.api_user au ON au.user_id = cl.user_id JOIN kbnteam.customer_loyalty_status cls ON cls.cus_loyalty_status_id = cl.cus_loyalty_status_id JOIN kbnteam.loyalty_tier lt ON lt.tier_id = cl.tier_id LEFT JOIN order_stats os ON os.customer_user_id = cl.user_id; }}} == Тестирање на перформанси == === Препорачано тест прашање === {{{ #!sql SET search_path TO kbnteam; SET statement_timeout = '60s'; -- Тест 1: по компанија EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_customer_loyalty_full_v2 WHERE company_id = 1; -- Тест 2: по ниво на верност EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_customer_loyalty_full_v2 WHERE tier_id = 1; -- Тест 3: по купувач (директна точка пристап) EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_customer_loyalty_full_v2 WHERE customer_user_id = 1; }}} === Резултати пред индексирање === ||= Метрика ||= Тест 1 (company) ||= Тест 2 (tier) ||= Тест 3 (customer) || || Planning Time || ___ ms || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || ___ ms || || Rows Returned || ___ || ___ || ___ || || customer_order scan || ___ || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) }}} === Применети индекси === {{{ #!sql -- indexes/v_customer_loyalty_full_v2_index.sql CREATE INDEX IF NOT EXISTS idx_customer_order_customer_user_id_order_datetime ON kbnteam.customer_order (customer_user_id, order_datetime DESC); }}} === Резултати по индексирање === ||= Метрика ||= Тест 1 (company) ||= Тест 2 (tier) ||= Тест 3 (customer) || || Planning Time || ___ ms || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || ___ ms || || Rows Returned || ___ || ___ || ___ || || customer_order scan || ___ || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (по индексирање) }}} === Анализа на подобрување === ||= Индекс ||= Помага на ||= Очекувана промена || || `idx_customer_order_customer_user_id_order_datetime` || CTE `order_stats` GROUP BY + MAX(order_datetime) || Seq Scan → Index Scan || ||= Метрика ||= Пред ||= По ||= Δ Подобрување || || Execution Time (Тест 3) || ___ ms || ___ ms || ___ % || '''Напомена:''' Индексот е особено ефективен при Тест 3 (по купувач) бидејќи CTE-то `order_stats` може директно да го скенира по `customer_user_id`. При целосен скен (Тест 1 или 2), подобрувањето зависи од бројот на редови.