= Преглед: v_company_users = ||= Датотека ||= `views/09_company_users_view.sql` || ||= Шема ||= `kbnteam` || ||= Категорија ||= Оперативна поддршка || ||= Поврзани индекси ||= Нема наменска датотека — ги користи споделените индекси || == Опис == Ги комбинира купувачите, возачите и api_admin корисниците во еден преглед ориентиран на компанија. Користи три `UNION` гранки — по една за секоја улога. Корисниците од тип driver и api_admin се прикажуваат само ако постои активен договор помеѓу компанијата и нивниот ресторан. == Зависности == ||= Табела ||= Улога ||= UNION гранка || || `kbnteam.customer` || Купувач || 1 (customer) || || `kbnteam.company` || Компанија || Сите || || `kbnteam.api_user` || Детали за корисник || Сите || || `kbnteam.contract` || Договор за компанија-ресторан || 2 (driver), 3 (admin) || || `kbnteam.restaurant` || Ресторан || 2 (driver), 3 (admin) || || `kbnteam.driver` || Возач || 2 (driver) || || `kbnteam.api_admin` || Администратор || 3 (admin) || == SQL Дефиниција == {{{ #!sql CREATE OR REPLACE VIEW kbnteam.v_company_users AS SELECT cu.company_id, cmp.company_name, 'customer'::text AS related_role, au.user_id, au.user_first_name, au.user_last_name, au.user_email, au.user_phone_no, NULL::integer AS rest_id, NULL::varchar(255) AS rest_name FROM kbnteam.customer cu JOIN kbnteam.company cmp ON cmp.company_id = cu.company_id JOIN kbnteam.api_user au ON au.user_id = cu.user_id UNION SELECT DISTINCT ct.company_id, cmp.company_name, 'driver'::text AS related_role, au.user_id, au.user_first_name, au.user_last_name, au.user_email, au.user_phone_no, r.rest_id, r.rest_name FROM kbnteam.contract ct JOIN kbnteam.company cmp ON cmp.company_id = ct.company_id JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id JOIN kbnteam.driver drv ON drv.rest_id = r.rest_id JOIN kbnteam.api_user au ON au.user_id = drv.user_id UNION SELECT DISTINCT ct.company_id, cmp.company_name, 'api_admin'::text AS related_role, au.user_id, au.user_first_name, au.user_last_name, au.user_email, au.user_phone_no, r.rest_id, r.rest_name FROM kbnteam.contract ct JOIN kbnteam.company cmp ON cmp.company_id = ct.company_id JOIN kbnteam.restaurant r ON r.rest_id = ct.rest_id JOIN kbnteam.api_admin aa ON aa.rest_id = r.rest_id JOIN kbnteam.api_user au ON au.user_id = aa.user_id; }}} == Тестирање на перформанси == === Препорачано тест прашање === {{{ #!sql SET search_path TO kbnteam; SET statement_timeout = '60s'; -- Тест 1: по компанија EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_company_users WHERE company_id = 1; -- Тест 2: по улога EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_company_users WHERE related_role = 'driver'; }}} === Резултати === Овој преглед нема наменска датотека за индекси. Перформансите зависат од договорните и корисничките индекси создадени за другите прегледи. ||= Метрика ||= Тест 1 (company_id) ||= Тест 2 (role) || || Planning Time || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || || Rows Returned || ___ || ___ || || Scan Type (customer) || ___ || ___ || || Scan Type (contract) || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде }}} === Потенцијални подобрувања === Доколку овој преглед е бавен, разгледајте: * Индекс на `customer(company_id)` — за Гранка 1 * Индекс на `contract(company_id)` (веќе создаден со `v_company_billing_overview_index.sql`) — за Гранки 2 и 3 * Индекс на `driver(rest_id)` (веќе создаден со `v_driver_lunch_timers_index.sql`) — за Гранка 2 * Индекс на `api_admin(rest_id)` — за Гранка 3