= Преглед: v_driver_deliveries = ||= Својство ||= Вредност || || Шема || `kbnteam` || || Категорија || Нарачки и достави || || Поврзани индекси || [wiki:DriverDeliveriesIndex Индекси за нарачки и достави] || == Опис == Ги прикажува доставите, доставувачите, рестораните, компаниите и поврзаните нарачки. Го користи прегледот на нарачки за деталите за клиентот и нарачаните производи. Се прикажуваат и доставите без назначен доставувач или поврзани нарачки. Еден ред за секоја клиентска нарачка во доставата. Достава без клиентски нарачки останува прикажана со NULL податоци за нарачката. Податоците за нарачките се добиваат преку [wiki:OrdersFullView v_orders_full]. Овој преглед е зависност на прегледот за достави. == Зависности == ||= Табела / преглед ||= Употреба || || `kbnteam.delivery` || Достави, датуми, забелешки и назначени доставувачи. || || `kbnteam.delivery_status` || Називи на статусите на доставите. || || `kbnteam.driver` || Доставувачи и нивните ресторани. || || `kbnteam.api_user` || Лични и контактни податоци за корисниците. || || `kbnteam.restaurant` || Податоци за рестораните. || || `kbnteam.company_order` || Поврзување на компаниските нарачки со компанијата и доставата. || || `kbnteam.company` || Податоци за компаниите. || || [wiki:OrdersFullView 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 дефиниција == {{{ #!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). === Измерен прашалник === {{{ #!sql 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)` || Пронаоѓање доставувачи по ресторан. || {{{ #!sql 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); }}} === Проверка на индексите === {{{ #!sql 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 секунди. За клиентските мерења треба да се усогласи и бројот на преземени редови. {{{ #!sql 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 || Не се измерени || Не се измерени ||