Changes between Version 1 and Version 2 of DriverLunchTimersView


Ignore:
Timestamp:
09/14/26 00:44:42 (2 weeks ago)
Author:
223235
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DriverLunchTimersView

    v1 v2  
    11= Преглед: v_driver_lunch_timers =
    22
    3 ||= Датотека ||= `views/07_driver_lunch_timers_view.sql` ||
    4 ||= Шема ||= `kbnteam` ||
    5 ||= Категорија ||= Оперативна поддршка ||
    6 ||= Поврзани индекси ||= `indexes/v_driver_lunch_timers_index.sql` ||
     3||= Својство ||= Вредност ||
     4|| Шема || `kbnteam` ||
     5|| Категорија || Термини за ручек ||
     6|| Поврзани индекси || [wiki:DriverLunchTimersIndex Индекси за термини за ручек] ||
    77
    88== Опис ==
    9 Ги наведува распоредите за ручек за возачи, договори и компании. Поврзува `lunch_time` со договорот, компанијата, ресторанот и сите возачи на тој ресторан. Особено погоден за распоредување базирано на денови од неделата и потсетници за возачи.
    109
    11 '''Важно:''' JOIN-от `driver drv ON drv.rest_id = r.rest_id` враќа по еден ред за секој возач на ресторанот, не само за одреден возач. Ако ресторанот има повеќе возачи, ќе добиете повеќе редови по распоред.
     10Ги поврзува термините за ручек со договорите, компаниите, рестораните и доставувачите.
     11
     12Се добива ред за секој термин и секој доставувач на ресторанот. Погледот не го ограничува резултатот на назначениот доставувач и не филтрира активни договори или денови. Термините за ресторани без доставувачи не се прикажуваат.
     13
     14Еден ред за секој пар термин–доставувач на ресторанот. Термин за ресторан без доставувачи не се прикажува; поврзаната компаниска нарачка може да биде NULL.
    1215
    1316== Зависности ==
    14 ||= Табела ||= Тип на употреба ||
    15 || `kbnteam.lunch_time` || Главна табела ||
    16 || `kbnteam.contract` || JOIN — договорот ||
    17 || `kbnteam.company` || JOIN — компанија ||
    18 || `kbnteam.restaurant` || JOIN — ресторан ||
    19 || `kbnteam.driver` || JOIN — сите возачи на ресторанот ||
    20 || `kbnteam.api_user` || JOIN — детали за возачот ||
     17
     18||= Табела / преглед ||= Употреба ||
     19|| `kbnteam.lunch_time` || Термини за ручек и поврзаните договори. ||
     20|| `kbnteam.contract` || Договори меѓу компаниите и рестораните. ||
     21|| `kbnteam.company` || Податоци за компаниите. ||
     22|| `kbnteam.restaurant` || Податоци за рестораните. ||
     23|| `kbnteam.driver` || Доставувачи и нивните ресторани. ||
     24|| `kbnteam.api_user` || Лични и контактни податоци за корисниците. ||
    2125
    2226== Излезни колони ==
    23 ||= Колона ||= Извор ||= Опис ||
    24 || `lunch_time_id` || `lunch_time` || Примарен клуч ||
    25 || `lunch_weekday` || `lunch_time` || Ден од неделата ||
    26 || `lunch_start` || `lunch_time` || Почеток на ручек ||
    27 || `lunch_end` || `lunch_time` || Крај на ручек ||
    28 || `lunch_preorder_offset` || `lunch_time` || Офсет за претходна нарачка (минути) ||
    29 || `comp_order_id` || `lunch_time` || Поврзана компаниска нарачка (NULL ако нема) ||
    30 || `contract_id` || `contract` || ID на договорот ||
    31 || `company_id` || `company` || ID на компанијата ||
    32 || `company_name` || `company` || Назив на компанијата ||
    33 || `rest_id` || `restaurant` || ID на ресторанот ||
    34 || `rest_name` || `restaurant` || Назив на ресторанот ||
    35 || `driver_user_id` || `driver` || ID на возачот ||
    36 || `driver_first_name` || `api_user` || Ime на возачот ||
    37 || `driver_last_name` || `api_user` || Презиме на возачот ||
    38 || `driver_phone` || `api_user` || Телефон на возачот ||
    3927
    40 == SQL Дефиниција ==
     28||= Колона ||= Извор / пресметка ||= Опис ||
     29|| `lunch_time_id` || `lunch_time.lunch_time_id` || Идентификатор на терминот за ручек. ||
     30|| `lunch_weekday` || `lunch_time.lunch_weekday` || Ден од неделата. ||
     31|| `lunch_start` || `lunch_time.lunch_start` || Почеток на терминот. ||
     32|| `lunch_end` || `lunch_time.lunch_end` || Крај на терминот. ||
     33|| `lunch_preorder_offset` || `lunch_time.lunch_preorder_offset` || Период за претходно нарачување. ||
     34|| `comp_order_id` || `lunch_time.comp_order_id` || Идентификатор на компаниската нарачка. ||
     35|| `contract_id` || `contract.contract_id` || Идентификатор на договорот. ||
     36|| `company_id` || `company.company_id` || Идентификатор на компанијата. ||
     37|| `company_name` || `company.company_name` || Назив на компанијата. ||
     38|| `rest_id` || `restaurant.rest_id` || Идентификатор на ресторанот. ||
     39|| `rest_name` || `restaurant.rest_name` || Назив на ресторанот. ||
     40|| `driver_user_id` || `driver.user_id` || Идентификатор на доставувачот. ||
     41|| `driver_first_name` || `api_user.user_first_name` || Име на доставувачот. ||
     42|| `driver_last_name` || `api_user.user_last_name` || Презиме на доставувачот. ||
     43|| `driver_phone` || `api_user.user_phone_no` || Телефон на доставувачот. ||
     44
     45== SQL дефиниција ==
     46
    4147{{{
    4248#!sql
    … …  
    6874== Тестирање на перформанси ==
    6975
    70 === Препорачано тест прашање ===
     76Примерите користат илустративни идентификатори и датуми. За споредливи мерења се избираат вредности што постојат во базата и се задржуваат истите податоци, филтри, услови за кеширање и број на повторувања. Статистиките за табелите треба да бидат ажурирани во двете состојби.
     77
     78=== Тест прашалници ===
     79
    7180{{{
    7281#!sql
    73 SET search_path TO kbnteam;
    74 SET statement_timeout = '60s';
     82BEGIN READ ONLY;
     83SET LOCAL statement_timeout = '60s';
    7584
    76 -- Тест 1: по ден од неделата (тестира idx на lunch_time)
     85-- Тест 1: по ден
    7786EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
    7887SELECT * FROM kbnteam.v_driver_lunch_timers
    … …  
    8897SELECT * FROM kbnteam.v_driver_lunch_timers
    8998WHERE rest_id = 1;
     99
     100ROLLBACK;
    90101}}}
    91102
     103Тестот само по ден служи како споредбен случај. Дополнителниот индекс за термини е по contract_id, па првенствено го поддржува тестот по договор.
     104
    92105=== Резултати пред индексирање ===
    93 ||= Метрика ||= Тест 1 (weekday) ||= Тест 2 (contract) ||= Тест 3 (rest_id) ||
     106
     107Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед.
     108
     109||= Метрика ||= Тест 1 (по ден) ||= Тест 2 (по договор) ||= Тест 3 (по ресторан) ||
    94110|| Planning Time || ___ ms || ___ ms || ___ ms ||
    95111|| Execution Time || ___ ms || ___ ms || ___ ms ||
    96112|| Rows Returned || ___ || ___ || ___ ||
    97 || lunch_time scan || ___ || ___ || ___ ||
    98 || driver scan || ___ || ___ || ___ ||
    99 || contract scan || ___ || ___ || ___ ||
     113|| Начин на читање по табела || ___ || ___ || ___ ||
     114|| Shared Hit Blocks || ___ || ___ || ___ ||
     115|| Shared Read Blocks || ___ || ___ || ___ ||
    100116
    101117{{{
    102 -- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
     118-- Планови и резултати пред дополнителното индексирање:
     119
    103120}}}
    104121
    105 === Применети индекси ===
     122=== Дополнителни и заеднички индекси ===
     123
     124Водечката колона contract_id овозможува пристап до термините според договорот. Самостоен услов само по lunch_weekday нема соодветен дополнителен индекс во овој сет.
     125
     126||= Индекс ||= Табела и колони ||= Намена ||
     127|| `idx_contract_company_id_rest_id` || `contract(company_id, rest_id)` || Пребарување договори по компанија и ресторан и групирање по компанија. ||
     128|| `idx_driver_rest_id` || `driver(rest_id)` || Пронаоѓање доставувачи по ресторан. ||
     129|| `idx_contract_rest_id_company_id` || `contract(rest_id, company_id)` || Пронаоѓање договори почнувајќи од ресторан. ||
     130|| `idx_lunch_time_contract_id` || `lunch_time(contract_id)` || Пронаоѓање термини за конкретен договор, без услов за денот од неделата. ||
     131
    106132{{{
    107133#!sql
    108 -- indexes/v_driver_lunch_timers_index.sql
    109 CREATE INDEX IF NOT EXISTS idx_lunch_time_weekday_contract_id
    110 ON kbnteam.lunch_time (lunch_weekday, contract_id);
     134CREATE INDEX IF NOT EXISTS idx_contract_company_id_rest_id
     135ON kbnteam.contract (company_id, rest_id);
    111136
    112137CREATE INDEX IF NOT EXISTS idx_driver_rest_id
    … …  
    115140CREATE INDEX IF NOT EXISTS idx_contract_rest_id_company_id
    116141ON kbnteam.contract (rest_id, company_id);
     142
     143CREATE INDEX IF NOT EXISTS idx_lunch_time_contract_id
     144ON kbnteam.lunch_time (contract_id);
     145}}}
     146
     147=== Проверка на индексите ===
     148
     149{{{
     150#!sql
     151SELECT tablename, indexname, indexdef
     152FROM pg_indexes
     153WHERE schemaname = 'kbnteam'
     154  AND indexname IN (
     155    'idx_contract_company_id_rest_id',
     156    'idx_driver_rest_id',
     157    'idx_contract_rest_id_company_id',
     158    'idx_lunch_time_contract_id'
     159)
     160ORDER BY tablename, indexname;
    117161}}}
    118162
    119163=== Резултати по индексирање ===
    120 ||= Метрика ||= Тест 1 (weekday) ||= Тест 2 (contract) ||= Тест 3 (rest_id) ||
     164
     165Мерењето ги користи истите тест прашалници и услови како почетното мерење.
     166
     167||= Метрика ||= Тест 1 (по ден) ||= Тест 2 (по договор) ||= Тест 3 (по ресторан) ||
    121168|| Planning Time || ___ ms || ___ ms || ___ ms ||
    122169|| Execution Time || ___ ms || ___ ms || ___ ms ||
    123170|| Rows Returned || ___ || ___ || ___ ||
    124 || lunch_time scan || ___ || ___ || ___ ||
    125 || driver scan || ___ || ___ || ___ ||
    126 || contract scan || ___ || ___ || ___ ||
     171|| Начин на читање по табела || ___ || ___ || ___ ||
     172|| Shared Hit Blocks || ___ || ___ || ___ ||
     173|| Shared Read Blocks || ___ || ___ || ___ ||
    127174
    128175{{{
    129 -- Излезот од EXPLAIN ANALYZE овде (по индексирање)
     176-- Планови и резултати по дополнителното индексирање:
     177
    130178}}}
    131179
    132180=== Анализа на подобрување ===
    133 ||= Индекс ||= Помага на ||= Очекувана промена ||
    134 || `idx_lunch_time_weekday_contract_id` || Тест 1 — филтрирање по ден || Seq Scan → Index Scan на `lunch_time` ||
    135 || `idx_driver_rest_id` || JOIN `driver ON drv.rest_id = r.rest_id` || Seq Scan → Index Scan на `driver` ||
    136 || `idx_contract_rest_id_company_id` || JOIN `contract` и Тест 3 || Seq Scan → Index Scan на `contract` ||
    137181
    138 ||= Метрика ||= Пред ||= По ||= Δ Подобрување ||
     182||= Метрика ||= Пред ||= По ||= Промена (%) ||
    139183|| Execution Time (Тест 1) || ___ ms || ___ ms || ___ % ||
    140184|| Execution Time (Тест 2) || ___ ms || ___ ms || ___ % ||
    141185|| Execution Time (Тест 3) || ___ ms || ___ ms || ___ % ||
     186
     187Промената се пресметува како 100 × (време пред − време по) / време пред, кога почетното време е поголемо од нула. Негативна вредност означува побавно извршување.
     188
     189Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење.