| 9 | | Обединет извештај за прегледи на нарачки и прегледи на достави преку `UNION ALL`. Двата подтипа имаат различни колони — полињата кои не постојат за еден тип се пополнуваат со `NULL`. Прегледот е погоден за пrikажување на оценки по ресторан, по возач или по купувач во веб апликацијата. |
| | 9 | |
| | 10 | Ги обединува оцените за нарачки и достави, со ознака за типот на рецензијата. |
| | 11 | |
| | 12 | Секој запис го задржува типот на рецензијата и соодветните оценки. Ако една рецензија се однесува и на нарачка и на достава, се прикажуваат двата записа. |
| | 13 | |
| | 14 | Еден ред за секој запис во поттипот за нарачка или достава. Рецензиите без поттип не се прикажуваат. Компанијата и доставувачот кај рецензија за достава можат да бидат NULL. |
| | 15 | |
| | 16 | Прегледот нема колона rest_id. Филтрирање по ресторан бара дополнително поврзување со податоците за нарачката или доставувачот. |
| 12 | | ||= Табела ||= Тип на употреба ||= Дел || |
| 13 | | || `kbnteam.review` || Главна табела || И двата дела || |
| 14 | | || `kbnteam.order_review` || JOIN — преглед на нарачка || Прв дел (order) || |
| 15 | | || `kbnteam.customer_order` || JOIN — нарачката || Прв дел || |
| 16 | | || `kbnteam.customer` || JOIN — купувач || Прв дел || |
| 17 | | || `kbnteam.api_user` || JOIN — детали за купувач/возач || И двата дела || |
| 18 | | || `kbnteam.company_order` || JOIN — компаниска нарачка || И двата дела || |
| 19 | | || `kbnteam.company` || JOIN — компанија || И двата дела || |
| 20 | | || `kbnteam.delivery_review` || JOIN — преглед на достава || Втор дел (delivery) || |
| 21 | | || `kbnteam.delivery` || JOIN — достава || Втор дел || |
| 22 | | || `kbnteam.driver` || LEFT JOIN — возач || Втор дел || |
| | 19 | |
| | 20 | ||= Табела / преглед ||= Употреба || |
| | 21 | || `kbnteam.review` || Заеднички податоци за рецензиите. || |
| | 22 | || `kbnteam.order_review` || Рецензии за нарачки и оценки за храна и ресторан. || |
| | 23 | || `kbnteam.customer_order` || Клиентски нарачки, датуми, статуси и износи. || |
| | 24 | || `kbnteam.api_user` || Лични и контактни податоци за корисниците. || |
| | 25 | || `kbnteam.company_order` || Поврзување на компаниските нарачки со компанијата и доставата. || |
| | 26 | || `kbnteam.company` || Податоци за компаниите. || |
| | 27 | || `kbnteam.delivery_review` || Рецензии за достави и оценки за доставувач и брзина. || |
| | 28 | || `kbnteam.delivery` || Достави, датуми, забелешки и назначени доставувачи. || |
| 25 | | ||= Колона ||= Опис ||= Нарачка ||= Достава || |
| 26 | | || `review_id` || ID на прегледот || ✓ || ✓ || |
| 27 | | || `review_type` || `'order'` или `'delivery'` || `'order'` || `'delivery'` || |
| 28 | | || `review_created_at` || Датум на прегледот || ✓ || ✓ || |
| 29 | | || `review_rating` || Општа оценка (1-5) || ✓ || ✓ || |
| 30 | | || `review_comment` || Коментар || ✓ || ✓ || |
| 31 | | || `order_id` || ID на нарачката || ✓ || NULL || |
| 32 | | || `delivery_id` || ID на доставата || NULL || ✓ || |
| 33 | | || `company_id` || ID на компанијата || ✓ || ✓ || |
| 34 | | || `company_name` || Назив на компанијата || ✓ || ✓ || |
| 35 | | || `customer_user_id` || ID на купувачот || ✓ || NULL || |
| 36 | | || `driver_user_id` || ID на возачот || NULL || ✓ || |
| 37 | | || `order_review_food_rating` || Оценка за храна (1-5) || ✓ || NULL || |
| 38 | | || `order_review_res_rating` || Оценка за ресторан (1-5) || ✓ || NULL || |
| 39 | | || `del_review_courier_rating` || Оценка за курир (1-5) || NULL || ✓ || |
| 40 | | || `del_review_speed_rating` || Оценка за брзина (1-5) || NULL || ✓ || |
| 41 | | |
| 42 | | == SQL Дефиниција == |
| | 31 | |
| | 32 | ||= Колона ||= Опис ||= Извор за order ||= Извор за delivery || |
| | 33 | || `review_id` || Идентификатор на рецензијата. || `review.review_id` || `review.review_id` || |
| | 34 | || `review_type` || Тип на рецензијата: order или delivery. || `'order'::text` || `'delivery'::text` || |
| | 35 | || `review_created_at` || Датум и време на рецензијата. || `review.review_created_at` || `review.review_created_at` || |
| | 36 | || `review_rating` || Општа оценка од 1 до 5. || `review.review_rating` || `review.review_rating` || |
| | 37 | || `review_comment` || Коментар за рецензијата. || `review.review_comment` || `review.review_comment` || |
| | 38 | || `order_id` || Идентификатор на клиентската нарачка. || `order_review.order_id` || `NULL::integer` || |
| | 39 | || `delivery_id` || Идентификатор на доставата. || `NULL::integer` || `delivery_review.delivery_id` || |
| | 40 | || `company_id` || Идентификатор на компанијата. || `company_order.company_id` || `company_order.company_id` || |
| | 41 | || `company_name` || Назив на компанијата. || `company.company_name` || `company.company_name` || |
| | 42 | || `customer_user_id` || Идентификатор на клиентот. || `api_user.user_id` || `NULL::integer` || |
| | 43 | || `customer_first_name` || Име на клиентот. || `api_user.user_first_name` || `NULL::varchar(255)` || |
| | 44 | || `customer_last_name` || Презиме на клиентот. || `api_user.user_last_name` || `NULL::varchar(255)` || |
| | 45 | || `driver_user_id` || Идентификатор на доставувачот. || `NULL::integer` || `api_user.user_id` || |
| | 46 | || `driver_first_name` || Име на доставувачот. || `NULL::varchar(255)` || `api_user.user_first_name` || |
| | 47 | || `driver_last_name` || Презиме на доставувачот. || `NULL::varchar(255)` || `api_user.user_last_name` || |
| | 48 | || `order_review_food_rating` || Оценка за храната од 1 до 5. || `order_review.order_review_food_rating` || `NULL::integer` || |
| | 49 | || `order_review_res_rating` || Оценка за ресторанот од 1 до 5. || `order_review.order_review_res_rating` || `NULL::integer` || |
| | 50 | || `del_review_courier_rating` || Оценка за доставувачот од 1 до 5. || `NULL::integer` || `delivery_review.del_review_courier_rating` || |
| | 51 | || `del_review_speed_rating` || Оценка за брзината од 1 до 5. || `NULL::integer` || `delivery_review.del_review_speed_rating` || |
| | 52 | |
| | 53 | == SQL дефиниција == |
| | 54 | |
| 107 | | === Препорачано тест прашање === |
| 108 | | {{{ |
| 109 | | #!sql |
| 110 | | SET search_path TO kbnteam; |
| 111 | | SET statement_timeout = '60s'; |
| 112 | | |
| 113 | | -- Тест 1: по тип на преглед |
| | 117 | Примерите користат илустративни идентификатори и датуми. За споредливи мерења се избираат вредности што постојат во базата и се задржуваат истите податоци, филтри, услови за кеширање и број на повторувања. Статистиките за табелите треба да бидат ажурирани во двете состојби. |
| | 118 | |
| | 119 | === Тест прашалници === |
| | 120 | |
| | 121 | {{{ |
| | 122 | #!sql |
| | 123 | BEGIN READ ONLY; |
| | 124 | SET LOCAL statement_timeout = '60s'; |
| | 125 | |
| | 126 | -- Тест 1: по тип и компанија |
| 125 | | ||= Метрика ||= Тест 1 (по тип) ||= Тест 2 (по company_id) || |
| 126 | | || Planning Time || ___ ms || ___ ms || |
| 127 | | || Execution Time || ___ ms || ___ ms || |
| 128 | | || Rows Returned || ___ || ___ || |
| 129 | | || customer_order scan || ___ || ___ || |
| 130 | | |
| 131 | | {{{ |
| 132 | | -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) |
| 133 | | }}} |
| 134 | | |
| 135 | | === Применети индекси === |
| 136 | | {{{ |
| 137 | | #!sql |
| 138 | | -- indexes/v_reviews_full_index.sql |
| | 145 | |
| | 146 | Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед. |
| | 147 | |
| | 148 | ||= Метрика ||= Тест 1 (по тип и компанија) ||= Тест 2 (по компанија) ||= Тест 3 (по доставувач) || |
| | 149 | || Planning Time || ___ ms || ___ ms || ___ ms || |
| | 150 | || Execution Time || ___ ms || ___ ms || ___ ms || |
| | 151 | || Rows Returned || ___ || ___ || ___ || |
| | 152 | || Начин на читање по табела || ___ || ___ || ___ || |
| | 153 | || Shared Hit Blocks || ___ || ___ || ___ || |
| | 154 | || Shared Read Blocks || ___ || ___ || ___ || |
| | 155 | |
| | 156 | {{{ |
| | 157 | -- Планови и резултати пред дополнителното индексирање: |
| | 158 | |
| | 159 | }}} |
| | 160 | |
| | 161 | === Дополнителни и заеднички индекси === |
| | 162 | |
| | 163 | `order_review(review_id)`, `order_review(order_id)`, `delivery_review(review_id)` и `delivery_review(delivery_id)` имаат уникатни индекси. `company_order(delivery_id)` исто така е уникатен. Останатите потребни индекси се споделени со нарачките и доставите. |
| | 164 | |
| | 165 | ||= Индекс ||= Табела и колони ||= Намена || |
| | 166 | || `idx_company_order_company_id` || `company_order(company_id)` || Пронаоѓање компаниски нарачки по компанија. || |
| | 167 | || `idx_customer_order_comp_order_id` || `customer_order(comp_order_id)` || Пронаоѓање клиентски нарачки по компаниска нарачка. || |
| | 168 | || `idx_delivery_driver_user_id_delivery_date` || `delivery(driver_user_id, delivery_date)` || Пронаоѓање достави по доставувач; во прегледите за нарачки и достави и по датум. || |
| | 169 | || `idx_customer_order_customer_user_id_order_datetime` || `customer_order(customer_user_id, order_datetime DESC)` || Пронаоѓање нарачки по клиент; поддршка за пристап по датум во рамки на клиентот. || |
| | 170 | |
| | 171 | {{{ |
| | 172 | #!sql |
| | 173 | CREATE INDEX IF NOT EXISTS idx_company_order_company_id |
| | 174 | ON kbnteam.company_order (company_id); |
| | 175 | |
| | 178 | |
| | 179 | CREATE INDEX IF NOT EXISTS idx_delivery_driver_user_id_delivery_date |
| | 180 | ON kbnteam.delivery (driver_user_id, delivery_date); |
| | 181 | |
| | 182 | CREATE INDEX IF NOT EXISTS idx_customer_order_customer_user_id_order_datetime |
| | 183 | ON kbnteam.customer_order (customer_user_id, order_datetime DESC); |
| | 184 | }}} |
| | 185 | |
| | 186 | === Проверка на индексите === |
| | 187 | |
| | 188 | {{{ |
| | 189 | #!sql |
| | 190 | SELECT tablename, indexname, indexdef |
| | 191 | FROM pg_indexes |
| | 192 | WHERE schemaname = 'kbnteam' |
| | 193 | AND indexname IN ( |
| | 194 | 'idx_company_order_company_id', |
| | 195 | 'idx_customer_order_comp_order_id', |
| | 196 | 'idx_delivery_driver_user_id_delivery_date', |
| | 197 | 'idx_customer_order_customer_user_id_order_datetime' |
| | 198 | ) |
| | 199 | ORDER BY tablename, indexname; |
| 144 | | ||= Метрика ||= Тест 1 (по тип) ||= Тест 2 (по company_id) || |
| 145 | | || Planning Time || ___ ms || ___ ms || |
| 146 | | || Execution Time || ___ ms || ___ ms || |
| 147 | | || Rows Returned || ___ || ___ || |
| 148 | | || customer_order scan || ___ || ___ || |
| 149 | | |
| 150 | | {{{ |
| 151 | | -- Излезот од EXPLAIN ANALYZE овде (по индексирање) |
| | 203 | |
| | 204 | Мерењето ги користи истите тест прашалници и услови како почетното мерење. |
| | 205 | |
| | 206 | ||= Метрика ||= Тест 1 (по тип и компанија) ||= Тест 2 (по компанија) ||= Тест 3 (по доставувач) || |
| | 207 | || Planning Time || ___ ms || ___ ms || ___ ms || |
| | 208 | || Execution Time || ___ ms || ___ ms || ___ ms || |
| | 209 | || Rows Returned || ___ || ___ || ___ || |
| | 210 | || Начин на читање по табела || ___ || ___ || ___ || |
| | 211 | || Shared Hit Blocks || ___ || ___ || ___ || |
| | 212 | || Shared Read Blocks || ___ || ___ || ___ || |
| | 213 | |
| | 214 | {{{ |
| | 215 | -- Планови и резултати по дополнителното индексирање: |
| | 216 | |
| 155 | | ||= Метрика ||= Пред ||= По ||= Δ Подобрување || |
| 156 | | || Execution Time || ___ ms || ___ ms || ___ % || |
| 157 | | |
| 158 | | '''Напомена:''' Прегледот `v_reviews_full` главно се потпира на споделени патеки на нарачки и достави. Индексот `idx_customer_order_comp_order_id` помага при JOIN-от на нарачки. Доколку работите со голем волумен на прегледи, разгледајте дополнителен индекс на `review(review_created_at)`. |
| | 220 | |
| | 221 | ||= Метрика ||= Пред ||= По ||= Промена (%) || |
| | 222 | || Execution Time (Тест 1) || ___ ms || ___ ms || ___ % || |
| | 223 | || Execution Time (Тест 2) || ___ ms || ___ ms || ___ % || |
| | 224 | || Execution Time (Тест 3) || ___ ms || ___ ms || ___ % || |
| | 225 | |
| | 226 | Промената се пресметува како 100 × (време пред − време по) / време пред, кога почетното време е поголемо од нула. Негативна вредност означува побавно извршување. |
| | 227 | |
| | 228 | Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење. |