Changes between Version 1 and Version 2 of DriverLunchTimersView
- Timestamp:
- 09/14/26 00:44:42 (2 weeks ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
DriverLunchTimersView
v1 v2 1 1 = Преглед: v_driver_lunch_timers = 2 2 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 Индекси за термини за ручек] || 7 7 8 8 == Опис == 9 Ги наведува распоредите за ручек за возачи, договори и компании. Поврзува `lunch_time` со договорот, компанијата, ресторанот и сите возачи на тој ресторан. Особено погоден за распоредување базирано на денови од неделата и потсетници за возачи.10 9 11 '''Важно:''' JOIN-от `driver drv ON drv.rest_id = r.rest_id` враќа по еден ред за секој возач на ресторанот, не само за одреден возач. Ако ресторанот има повеќе возачи, ќе добиете повеќе редови по распоред. 10 Ги поврзува термините за ручек со договорите, компаниите, рестораните и доставувачите. 11 12 Се добива ред за секој термин и секој доставувач на ресторанот. Погледот не го ограничува резултатот на назначениот доставувач и не филтрира активни договори или денови. Термините за ресторани без доставувачи не се прикажуваат. 13 14 Еден ред за секој пар термин–доставувач на ресторанот. Термин за ресторан без доставувачи не се прикажува; поврзаната компаниска нарачка може да биде NULL. 12 15 13 16 == Зависности == 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` || Лични и контактни податоци за корисниците. || 21 25 22 26 == Излезни колони == 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` || Телефон на возачот ||39 27 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 41 47 {{{ 42 48 #!sql … … 68 74 == Тестирање на перформанси == 69 75 70 === Препорачано тест прашање === 76 Примерите користат илустративни идентификатори и датуми. За споредливи мерења се избираат вредности што постојат во базата и се задржуваат истите податоци, филтри, услови за кеширање и број на повторувања. Статистиките за табелите треба да бидат ажурирани во двете состојби. 77 78 === Тест прашалници === 79 71 80 {{{ 72 81 #!sql 73 SET search_path TO kbnteam;74 SET statement_timeout = '60s';82 BEGIN READ ONLY; 83 SET LOCAL statement_timeout = '60s'; 75 84 76 -- Тест 1: по ден од неделата (тестира idx на lunch_time)85 -- Тест 1: по ден 77 86 EXPLAIN (ANALYZE, BUFFERS, VERBOSE) 78 87 SELECT * FROM kbnteam.v_driver_lunch_timers … … 88 97 SELECT * FROM kbnteam.v_driver_lunch_timers 89 98 WHERE rest_id = 1; 99 100 ROLLBACK; 90 101 }}} 91 102 103 Тестот само по ден служи како споредбен случај. Дополнителниот индекс за термини е по contract_id, па првенствено го поддржува тестот по договор. 104 92 105 === Резултати пред индексирање === 93 ||= Метрика ||= Тест 1 (weekday) ||= Тест 2 (contract) ||= Тест 3 (rest_id) || 106 107 Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед. 108 109 ||= Метрика ||= Тест 1 (по ден) ||= Тест 2 (по договор) ||= Тест 3 (по ресторан) || 94 110 || Planning Time || ___ ms || ___ ms || ___ ms || 95 111 || Execution Time || ___ ms || ___ ms || ___ ms || 96 112 || Rows Returned || ___ || ___ || ___ || 97 || lunch_time scan|| ___ || ___ || ___ ||98 || driver scan|| ___ || ___ || ___ ||99 || contract scan|| ___ || ___ || ___ ||113 || Начин на читање по табела || ___ || ___ || ___ || 114 || Shared Hit Blocks || ___ || ___ || ___ || 115 || Shared Read Blocks || ___ || ___ || ___ || 100 116 101 117 {{{ 102 -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) 118 -- Планови и резултати пред дополнителното индексирање: 119 103 120 }}} 104 121 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 106 132 {{{ 107 133 #!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); 134 CREATE INDEX IF NOT EXISTS idx_contract_company_id_rest_id 135 ON kbnteam.contract (company_id, rest_id); 111 136 112 137 CREATE INDEX IF NOT EXISTS idx_driver_rest_id … … 115 140 CREATE INDEX IF NOT EXISTS idx_contract_rest_id_company_id 116 141 ON kbnteam.contract (rest_id, company_id); 142 143 CREATE INDEX IF NOT EXISTS idx_lunch_time_contract_id 144 ON kbnteam.lunch_time (contract_id); 145 }}} 146 147 === Проверка на индексите === 148 149 {{{ 150 #!sql 151 SELECT tablename, indexname, indexdef 152 FROM pg_indexes 153 WHERE 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 ) 160 ORDER BY tablename, indexname; 117 161 }}} 118 162 119 163 === Резултати по индексирање === 120 ||= Метрика ||= Тест 1 (weekday) ||= Тест 2 (contract) ||= Тест 3 (rest_id) || 164 165 Мерењето ги користи истите тест прашалници и услови како почетното мерење. 166 167 ||= Метрика ||= Тест 1 (по ден) ||= Тест 2 (по договор) ||= Тест 3 (по ресторан) || 121 168 || Planning Time || ___ ms || ___ ms || ___ ms || 122 169 || Execution Time || ___ ms || ___ ms || ___ ms || 123 170 || Rows Returned || ___ || ___ || ___ || 124 || lunch_time scan|| ___ || ___ || ___ ||125 || driver scan|| ___ || ___ || ___ ||126 || contract scan|| ___ || ___ || ___ ||171 || Начин на читање по табела || ___ || ___ || ___ || 172 || Shared Hit Blocks || ___ || ___ || ___ || 173 || Shared Read Blocks || ___ || ___ || ___ || 127 174 128 175 {{{ 129 -- Излезот од EXPLAIN ANALYZE овде (по индексирање) 176 -- Планови и резултати по дополнителното индексирање: 177 130 178 }}} 131 179 132 180 === Анализа на подобрување === 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` ||137 181 138 ||= Метрика ||= Пред ||= По ||= Δ Подобрување||182 ||= Метрика ||= Пред ||= По ||= Промена (%) || 139 183 || Execution Time (Тест 1) || ___ ms || ___ ms || ___ % || 140 184 || Execution Time (Тест 2) || ___ ms || ___ ms || ___ % || 141 185 || Execution Time (Тест 3) || ___ ms || ___ ms || ___ % || 186 187 Промената се пресметува како 100 × (време пред − време по) / време пред, кога почетното време е поголемо од нула. Негативна вредност означува побавно извршување. 188 189 Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење.
