Преглед: 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 Дефиниција
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;
Тестирање на перформанси
Препорачано тест прашање
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 овде (пред индексирање)
Применети индекси
-- 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 | _ %
|