= Преглед: v_driver_lunch_timers = ||= Датотека ||= `views/07_driver_lunch_timers_view.sql` || ||= Шема ||= `kbnteam` || ||= Категорија ||= Оперативна поддршка || ||= Поврзани индекси ||= `indexes/v_driver_lunch_timers_index.sql` || == Опис == Ги наведува распоредите за ручек за возачи, договори и компании. Поврзува `lunch_time` со договорот, компанијата, ресторанот и сите возачи на тој ресторан. Особено погоден за распоредување базирано на денови од неделата и потсетници за возачи. '''Важно:''' JOIN-от `driver drv ON drv.rest_id = r.rest_id` враќа по еден ред за секој возач на ресторанот, не само за одреден возач. Ако ресторанот има повеќе возачи, ќе добиете повеќе редови по распоред. == Зависности == ||= Табела ||= Тип на употреба || || `kbnteam.lunch_time` || Главна табела || || `kbnteam.contract` || JOIN — договорот || || `kbnteam.company` || JOIN — компанија || || `kbnteam.restaurant` || JOIN — ресторан || || `kbnteam.driver` || JOIN — сите возачи на ресторанот || || `kbnteam.api_user` || JOIN — детали за возачот || == Излезни колони == ||= Колона ||= Извор ||= Опис || || `lunch_time_id` || `lunch_time` || Примарен клуч || || `lunch_weekday` || `lunch_time` || Ден од неделата || || `lunch_start` || `lunch_time` || Почеток на ручек || || `lunch_end` || `lunch_time` || Крај на ручек || || `lunch_preorder_offset` || `lunch_time` || Офсет за претходна нарачка (минути) || || `comp_order_id` || `lunch_time` || Поврзана компаниска нарачка (NULL ако нема) || || `contract_id` || `contract` || ID на договорот || || `company_id` || `company` || ID на компанијата || || `company_name` || `company` || Назив на компанијата || || `rest_id` || `restaurant` || ID на ресторанот || || `rest_name` || `restaurant` || Назив на ресторанот || || `driver_user_id` || `driver` || ID на возачот || || `driver_first_name` || `api_user` || Ime на возачот || || `driver_last_name` || `api_user` || Презиме на возачот || || `driver_phone` || `api_user` || Телефон на возачот || == SQL Дефиниција == {{{ #!sql CREATE OR REPLACE VIEW kbnteam.v_driver_lunch_timers AS SELECT lt.lunch_time_id, lt.lunch_weekday, lt.lunch_start, lt.lunch_end, lt.lunch_preorder_offset, lt.comp_order_id, ct.contract_id, cmp.company_id, cmp.company_name, r.rest_id, r.rest_name, drv.user_id AS driver_user_id, au.user_first_name AS driver_first_name, au.user_last_name AS driver_last_name, au.user_phone_no AS driver_phone FROM kbnteam.lunch_time lt JOIN kbnteam.contract ct ON ct.contract_id = lt.contract_id 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; }}} == Тестирање на перформанси == === Препорачано тест прашање === {{{ #!sql SET search_path TO kbnteam; SET statement_timeout = '60s'; -- Тест 1: по ден од неделата (тестира idx на lunch_time) EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_driver_lunch_timers WHERE lunch_weekday = 'Monday'; -- Тест 2: по договор EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_driver_lunch_timers WHERE contract_id = 1; -- Тест 3: по ресторан EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_driver_lunch_timers WHERE rest_id = 1; }}} === Резултати пред индексирање === ||= Метрика ||= Тест 1 (weekday) ||= Тест 2 (contract) ||= Тест 3 (rest_id) || || Planning Time || ___ ms || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || ___ ms || || Rows Returned || ___ || ___ || ___ || || lunch_time scan || ___ || ___ || ___ || || driver scan || ___ || ___ || ___ || || contract scan || ___ || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) }}} === Применети индекси === {{{ #!sql -- indexes/v_driver_lunch_timers_index.sql CREATE INDEX IF NOT EXISTS idx_lunch_time_weekday_contract_id ON kbnteam.lunch_time (lunch_weekday, contract_id); CREATE INDEX IF NOT EXISTS idx_driver_rest_id ON kbnteam.driver (rest_id); CREATE INDEX IF NOT EXISTS idx_contract_rest_id_company_id ON kbnteam.contract (rest_id, company_id); }}} === Резултати по индексирање === ||= Метрика ||= Тест 1 (weekday) ||= Тест 2 (contract) ||= Тест 3 (rest_id) || || Planning Time || ___ ms || ___ ms || ___ ms || || Execution Time || ___ ms || ___ ms || ___ ms || || Rows Returned || ___ || ___ || ___ || || lunch_time scan || ___ || ___ || ___ || || driver scan || ___ || ___ || ___ || || contract scan || ___ || ___ || ___ || {{{ -- Излезот од EXPLAIN ANALYZE овде (по индексирање) }}} === Анализа на подобрување === ||= Индекс ||= Помага на ||= Очекувана промена || || `idx_lunch_time_weekday_contract_id` || Тест 1 — филтрирање по ден || Seq Scan → Index Scan на `lunch_time` || || `idx_driver_rest_id` || JOIN `driver ON drv.rest_id = r.rest_id` || Seq Scan → Index Scan на `driver` || || `idx_contract_rest_id_company_id` || JOIN `contract` и Тест 3 || Seq Scan → Index Scan на `contract` || ||= Метрика ||= Пред ||= По ||= Δ Подобрување || || Execution Time (Тест 1) || ___ ms || ___ ms || ___ % || || Execution Time (Тест 2) || ___ ms || ___ ms || ___ % || || Execution Time (Тест 3) || ___ ms || ___ ms || ___ % ||