wiki:DriverDeliveriesView

Version 4 (modified by 223162, 11 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;

Тестирање на перформанси

„Пред индексирање“ и „по индексирање“ ги означуваат групите наведени како „без индекси“ и „со индекси“ во евиденцијата. Точниот сет присутни индекси во секоја група не е евидентиран; „без индекси“ не потврдува отсуство на индекси од примарни и уникатни клучеви.

Наведените времиња се клиентски мерења од DBeaver, а не серверските Planning Time и Execution Time од EXPLAIN ANALYZE. Нема приложени планови, типови на скенирање или податоци за баферите. Вредностите се во милисекунди (ms).

Измерен прашалник

SELECT * FROM kbnteam.v_driver_deliveries
WHERE driver_user_id = 450;

Резултати пред индексирање

Метрика Измерен резултат
Клиентско време (ms) околу 70000
Приказ на мерењето Време прикажано со резултатот во DBeaver
Прикажани / преземени редови 200 преземени; вкупниот број не е утврден
Planning Time / Execution Time од EXPLAIN Не се измерени
План, тип на скенирање и бафери Не се приложени

Дополнителни и заеднички индекси

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;

Резултати по индексирање

Метрика Измерен резултат
Клиентско време (ms) 48236
Приказ на мерењето Статистика за 2 наредби: 48208 ms извршување, 28 ms преземање, 48236 ms вкупно
Прикажани / преземени редови Не е утврден од приказот на статистиката
Planning Time / Execution Time од EXPLAIN Не се измерени
План, тип на скенирање и бафери Не се приложени

Анализа на резултатите

Метрика Пред По Промена на времето
Клиентско време (ms) околу 70000 48236 Не се пресметува

Споредбата е ориентациска. Во состојбата „без индекси“ се гледаат околу 1 min 10 s и 200 преземени редови, со ограничување на преземањето на 200. Во состојбата „со индекси“ се прикажува статистика за 2 наредби: 48208 ms извршување, 28 ms преземање и 48236 ms вкупно. Еден прикажан ред во статистиката не е бројот на достави. Не се пресметува процент на забрзување поради различниот опфат на мерењата.

Ова се поединечни набљудувања. Не се евидентирани контролирани повторувања, исти услови за кеширање и оптоварување или точните дефиниции на присутните индекси. Затоа промената на времето не е доказ дека индексите се единствената причина. Не се приложени мерења за INSERT, UPDATE и DELETE.

Дополнително тестирање - сè уште неизмерено

Следниот прашалник служи за ново мерење на серверскиот план со истиот филтер. Неговите резултати не се пополнети со клиентските времиња наведени погоре. За споредба се задржуваат исти податоци и поставки, се евидентираат присутните индекси, се ажурираат статистиките и се прават повеќе повторувања во двете состојби. Се споредуваат медијаната на времињата и плановите.

За овој дополнителен тест е предвиден лимит од 180 секунди, бидејќи забележаното клиентско време без индекси е околу 70 секунди. За клиентските мерења треба да се усогласи и бројот на преземени редови.

BEGIN READ ONLY;
SET LOCAL statement_timeout = '180s';

EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
SELECT * FROM kbnteam.v_driver_deliveries
WHERE driver_user_id = 450;

ROLLBACK;
Метрика за дополнителното тестирање Пред По
Planning Time (ms) Не е измерено Не е измерено
Execution Time (ms) Не е измерено Не е измерено
Тип на скенирање по табела Не е евидентиран Не е евидентиран
Shared Hit Blocks / Shared Read Blocks Не се измерени Не се измерени
Note: See TracWiki for help on using the wiki.