| Version 2 (modified by , 13 days ago) ( diff ) |
|---|
Преглед: v_driver_deliveries
| Својство | Вредност |
|---|---|
| Шема | kbnteam
|
| Категорија | Нарачки и достави |
| Поврзани индекси | Индекси за нарачки и достави |
Опис
Ги прикажува доставите, доставувачите, рестораните, компаниите и поврзаните нарачки.
Го користи прегледот на нарачки за деталите за клиентот и нарачаните производи. Се прикажуваат и доставите без назначен доставувач или поврзани нарачки.
Еден ред за секоја клиентска нарачка во доставата. Достава без клиентски нарачки останува прикажана со NULL податоци за нарачката.
Податоците за нарачките се добиваат преку v_orders_full. Овој преглед е зависност на прегледот за достави.
Зависности
| Табела / преглед | Употреба |
|---|---|
kbnteam.delivery | Достави, датуми, забелешки и назначени доставувачи. |
kbnteam.delivery_status | Називи на статусите на доставите. |
kbnteam.driver | Доставувачи и нивните ресторани. |
kbnteam.api_user | Лични и контактни податоци за корисниците. |
kbnteam.restaurant | Податоци за рестораните. |
kbnteam.company_order | Поврзување на компаниските нарачки со компанијата и доставата. |
kbnteam.company | Податоци за компаниите. |
| v_orders_full | Преглед со детали за клиентските нарачки и листи со производи. |
Излезни колони
| Колона | Извор / пресметка | Опис |
|---|---|---|
delivery_id | delivery.delivery_id | Идентификатор на доставата. |
delivery_date | delivery.delivery_date | Датум на доставата. |
delivery_notes | delivery.delivery_notes | Забелешки за доставата. |
d_status_name | delivery_status.d_status_name | Статус на доставата. |
driver_user_id | driver.user_id | Идентификатор на доставувачот. |
driver_first_name | api_user.user_first_name | Име на доставувачот. |
driver_last_name | api_user.user_last_name | Презиме на доставувачот. |
driver_phone | api_user.user_phone_no | Телефон на доставувачот. |
rest_id | restaurant.rest_id | Идентификатор на ресторанот. |
rest_name | restaurant.rest_name | Назив на ресторанот. |
comp_order_id | company_order.comp_order_id | Идентификатор на компаниската нарачка. |
company_id | company.company_id | Идентификатор на компанијата. |
company_name | company.company_name | Назив на компанијата. |
order_id | v_orders_full.order_id | Идентификатор на клиентската нарачка. |
order_datetime | v_orders_full.order_datetime | Датум и време на нарачката. |
order_total | v_orders_full.order_total | Вкупен износ на нарачката. |
customer_user_id | v_orders_full.customer_user_id | Идентификатор на клиентот. |
customer_first_name | v_orders_full.customer_first_name | Име на клиентот. |
customer_last_name | v_orders_full.customer_last_name | Презиме на клиентот. |
customer_email | v_orders_full.customer_email | Е-пошта на клиентот. |
meals | COALESCE(v_orders_full.meals, '') | Подредена листа со називи на нарачаните јадења. |
drinks | COALESCE(v_orders_full.drinks, '') | Подредена листа со називи на нарачаните пијалоци. |
SQL дефиниција
CREATE OR REPLACE VIEW kbnteam.v_driver_deliveries AS
SELECT
d.delivery_id,
d.delivery_date,
d.delivery_notes,
ds.d_status_name,
drv.user_id AS driver_user_id,
du.user_first_name AS driver_first_name,
du.user_last_name AS driver_last_name,
du.user_phone_no AS driver_phone,
r.rest_id,
r.rest_name,
co.comp_order_id,
cmp.company_id,
cmp.company_name,
o.order_id,
o.order_datetime,
o.order_total,
o.customer_user_id,
o.customer_first_name,
o.customer_last_name,
o.customer_email,
COALESCE(o.meals, '') AS meals,
COALESCE(o.drinks, '') AS drinks
FROM kbnteam.delivery d
JOIN kbnteam.delivery_status ds ON ds.d_status_id = d.d_status_id
LEFT JOIN kbnteam.driver drv ON drv.user_id = d.driver_user_id
LEFT JOIN kbnteam.api_user du ON du.user_id = drv.user_id
LEFT JOIN kbnteam.restaurant r ON r.rest_id = drv.rest_id
LEFT JOIN kbnteam.company_order co ON co.delivery_id = d.delivery_id
LEFT JOIN kbnteam.company cmp ON cmp.company_id = co.company_id
LEFT JOIN kbnteam.v_orders_full o ON o.comp_order_id = co.comp_order_id;
Тестирање на перформанси
Примерите користат илустративни идентификатори и датуми. За споредливи мерења се избираат вредности што постојат во базата и се задржуваат истите податоци, филтри, услови за кеширање и број на повторувања. Статистиките за табелите треба да бидат ажурирани во двете состојби.
Тест прашалници
BEGIN READ ONLY; SET LOCAL statement_timeout = '60s'; -- Тест 1: по доставувач и датум EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_driver_deliveries WHERE driver_user_id = 1 AND delivery_date >= DATE '2026-09-01' AND delivery_date < DATE '2026-10-01'; -- Тест 2: по компаниска нарачка EXPLAIN (ANALYZE, BUFFERS, VERBOSE) SELECT * FROM kbnteam.v_driver_deliveries WHERE comp_order_id = 1; ROLLBACK;
Резултати пред индексирање
Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед.
| Метрика | Тест 1 (по доставувач и датум) | Тест 2 (по компаниска нарачка) |
|---|---|---|
| Planning Time | _ ms | _ ms |
| Execution Time | _ ms | _ ms |
| Rows Returned | _ | _ |
| Начин на читање по табела | _ | _ |
| Shared Hit Blocks | _ | _ |
| Shared Read Blocks | _ | _ |
-- Планови и резултати пред дополнителното индексирање:
Дополнителни и заеднички индекси
company_order(delivery_id) има уникатен индекс. Прегледот ги користи и индексите за нарачките преку v_orders_full.
| Индекс | Табела и колони | Намена |
|---|---|---|
idx_company_order_company_id | company_order(company_id) | Пронаоѓање компаниски нарачки по компанија. |
idx_customer_order_comp_order_id | customer_order(comp_order_id) | Пронаоѓање клиентски нарачки по компаниска нарачка. |
idx_order_meal_order_id_meal_id | order_meal(order_id, meal_id) | Пристап до јадењата на нарачката и групирање по order_id. |
idx_order_drink_order_id_drink_id | order_drink(order_id, drink_id) | Пристап до пијалоците на нарачката и групирање по order_id. |
idx_delivery_driver_user_id_delivery_date | delivery(driver_user_id, delivery_date) | Пронаоѓање достави по доставувач; во прегледите за нарачки и достави и по датум. |
idx_driver_rest_id | driver(rest_id) | Пронаоѓање доставувачи по ресторан. |
CREATE INDEX IF NOT EXISTS idx_company_order_company_id ON kbnteam.company_order (company_id); CREATE INDEX IF NOT EXISTS idx_customer_order_comp_order_id ON kbnteam.customer_order (comp_order_id); CREATE INDEX IF NOT EXISTS idx_order_meal_order_id_meal_id ON kbnteam.order_meal (order_id, meal_id); CREATE INDEX IF NOT EXISTS idx_order_drink_order_id_drink_id ON kbnteam.order_drink (order_id, drink_id); CREATE INDEX IF NOT EXISTS idx_delivery_driver_user_id_delivery_date ON kbnteam.delivery (driver_user_id, delivery_date); CREATE INDEX IF NOT EXISTS idx_driver_rest_id ON kbnteam.driver (rest_id);
Проверка на индексите
SELECT tablename, indexname, indexdef
FROM pg_indexes
WHERE schemaname = 'kbnteam'
AND indexname IN (
'idx_company_order_company_id',
'idx_customer_order_comp_order_id',
'idx_order_meal_order_id_meal_id',
'idx_order_drink_order_id_drink_id',
'idx_delivery_driver_user_id_delivery_date',
'idx_driver_rest_id'
)
ORDER BY tablename, indexname;
Резултати по индексирање
Мерењето ги користи истите тест прашалници и услови како почетното мерење.
| Метрика | Тест 1 (по доставувач и датум) | Тест 2 (по компаниска нарачка) |
|---|---|---|
| Planning Time | _ ms | _ ms |
| Execution Time | _ ms | _ ms |
| Rows Returned | _ | _ |
| Начин на читање по табела | _ | _ |
| Shared Hit Blocks | _ | _ |
| Shared Read Blocks | _ | _ |
-- Планови и резултати по дополнителното индексирање:
Анализа на подобрување
| Метрика | Пред | По | Промена (%) |
|---|---|---|---|
| Execution Time (Тест 1) | _ ms | _ ms | _ % |
| Execution Time (Тест 2) | _ ms | _ ms | _ % |
Промената се пресметува како 100 × (време пред − време по) / време пред, кога почетното време е поголемо од нула. Негативна вредност означува побавно извршување.
Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење.
