Changes between Version 2 and Version 3 of MenuDrinkView
- Timestamp:
- 09/14/26 00:39:05 (2 weeks ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
MenuDrinkView
v2 v3 1 1 = Преглед: v_menu_drink = 2 2 3 ||= Датотека ||= `views/01_menu_drink_view.sql`||4 || = Шема ||=`kbnteam` ||5 || = Категорија ||= Мени и Каталог ||6 || = Поврзани индекси ||= `indexes/v_menu_drink_index.sql`||3 ||= Својство ||= Вредност || 4 || Шема || `kbnteam` || 5 || Категорија || Мени и каталог || 6 || Поврзани индекси || Примарни и уникатни клучеви || 7 7 8 8 == Опис == 9 Едноставен преглед кој ги наведува сите пијачи достапни на секој ресторан заедно со деталите за ресторанот. Се користи за прелистување на мени и нарачки преку веб апликацијата. 9 10 Ги прикажува пијалоците, нивната количина и цена, како и ресторанот. 11 12 Едноставно спојување на `drink` и `restaurant`, без агрегации. 13 14 Еден ред за секој пијалак. Менито не се ограничува според активноста на договорите. 10 15 11 16 == Зависности == 12 ||= Табела ||= Тип на употреба || 13 || `kbnteam.drink` || Главна табела — ги содржи деталите за пијачот || 14 || `kbnteam.restaurant` || JOIN — ги додава деталите за ресторанот || 17 18 ||= Табела / преглед ||= Употреба || 19 || `kbnteam.drink` || Пијалоци, количини, цени и ресторан. || 20 || `kbnteam.restaurant` || Податоци за рестораните. || 15 21 16 22 == Излезни колони == 17 ||= Колона ||= Извор ||= Опис ||18 || `drink_id` || `drink.drink_id` || Примарен клуч на пијачот ||19 || `drink_name` || `drink.drink_name` || Назив на пијачот ||20 || `drink_milliliters` || `drink.drink_milliliters` || Волумен во милилитри ||21 || `drink_price` || `drink.drink_price` || Цена ||22 || `rest_id` || `restaurant.rest_id` || Примарен клуч на ресторанот ||23 || `rest_name` || `restaurant.rest_name` || Назив на ресторанот ||24 23 25 == SQL Дефиниција == 24 ||= Колона ||= Извор / пресметка ||= Опис || 25 || `drink_id` || `drink.drink_id` || Идентификатор на пијалакот. || 26 || `drink_name` || `drink.drink_name` || Назив на пијалакот. || 27 || `drink_milliliters` || `drink.drink_milliliters` || Количина во милилитри. || 28 || `drink_price` || `drink.drink_price` || Цена на пијалакот. || 29 || `rest_id` || `restaurant.rest_id` || Идентификатор на ресторанот. || 30 || `rest_name` || `restaurant.rest_name` || Назив на ресторанот. || 31 32 == SQL дефиниција == 33 26 34 {{{ 27 35 #!sql … … 40 48 == Тестирање на перформанси == 41 49 42 === Препорачано тест прашање === 50 Примерите користат илустративни идентификатори и датуми. За споредливи мерења се избираат вредности што постојат во базата и се задржуваат истите податоци, филтри, услови за кеширање и број на повторувања. Статистиките за табелите треба да бидат ажурирани во двете состојби. 51 52 === Тест прашалници === 53 43 54 {{{ 44 55 #!sql 45 SET search_path TO kbnteam;46 SET statement_timeout = '60s';56 BEGIN READ ONLY; 57 SET LOCAL statement_timeout = '60s'; 47 58 48 -- Тест 1: целосен скен на прегледот59 -- Тест 1: целосен преглед 49 60 EXPLAIN (ANALYZE, BUFFERS, VERBOSE) 50 61 SELECT * FROM kbnteam.v_menu_drink; 51 62 52 -- Тест 2: филтрирање по ресторан (препорачано за мерење на индексот)63 -- Тест 2: по ресторан 53 64 EXPLAIN (ANALYZE, BUFFERS, VERBOSE) 54 65 SELECT * FROM kbnteam.v_menu_drink 55 66 WHERE rest_id = 1; 67 68 ROLLBACK; 56 69 }}} 57 70 58 71 === Резултати пред индексирање === 59 Извршете ги горните прашања '''пред''' да ја примените датотеката `indexes/v_menu_drink_index.sql`.60 72 61 ||= Метрика ||= Тест 1 (целосен скен) ||= Тест 2 (по rest_id) || 73 Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед. 74 75 ||= Метрика ||= Тест 1 (целосен преглед) ||= Тест 2 (по ресторан) || 62 76 || Planning Time || ___ ms || ___ ms || 63 77 || Execution Time || ___ ms || ___ ms || 64 78 || Rows Returned || ___ || ___ || 65 || Scan Type || ___ || ___ || 79 || Начин на читање по табела || ___ || ___ || 80 || Shared Hit Blocks || ___ || ___ || 81 || Shared Read Blocks || ___ || ___ || 66 82 67 83 {{{ 68 -- Излезот од EXPLAIN ANALYZE овде (пред индексирање) 84 -- Планови и резултати пред дополнителното индексирање: 85 69 86 }}} 70 87 71 === Применети индекси === 88 === Дополнителни и заеднички индекси === 89 90 `drink(rest_id, drink_name)` е покриен со уникатното ограничување `uq_drink_restaurant_name`, а `restaurant(rest_id)` со примарен клуч. За овој преглед нема дополнителен индекс. 91 92 Нема дополнителна CREATE INDEX наредба за овој преглед. Двете мерења го користат истото основно покривање со индекси. 93 94 === Проверка на индексите === 95 72 96 {{{ 73 97 #!sql 74 -- indexes/v_menu_drink_index.sql 75 -- Забелешка: провери дали idx_drink_rest_id_drink_id е навистина потребен — 76 -- ако uq_drink_restaurant_name е на (rest_id, drink_name), тој веќе 77 -- е доволен за филтрирање само по rest_id (Тест 2). 78 CREATE INDEX IF NOT EXISTS idx_drink_rest_id_drink_id 79 ON kbnteam.drink (rest_id, drink_id); 98 SELECT tablename, indexname, indexdef 99 FROM pg_indexes 100 WHERE schemaname = 'kbnteam' 101 AND tablename IN ('drink', 'restaurant') 102 ORDER BY tablename, indexname; 80 103 }}} 81 104 82 105 === Резултати по индексирање === 83 Извршете ги истите прашања '''по''' примена на `indexes/v_menu_drink_index.sql`.84 106 85 ||= Метрика ||= Тест 1 (целосен скен) ||= Тест 2 (по rest_id) || 107 Мерењето ги користи истите тест прашалници и услови како почетното мерење. 108 109 ||= Метрика ||= Тест 1 (целосен преглед) ||= Тест 2 (по ресторан) || 86 110 || Planning Time || ___ ms || ___ ms || 87 111 || Execution Time || ___ ms || ___ ms || 88 112 || Rows Returned || ___ || ___ || 89 || Scan Type || ___ || ___ || 113 || Начин на читање по табела || ___ || ___ || 114 || Shared Hit Blocks || ___ || ___ || 115 || Shared Read Blocks || ___ || ___ || 90 116 91 117 {{{ 92 -- Излезот од EXPLAIN ANALYZE овде (по индексирање) 118 -- Планови и резултати по дополнителното индексирање: 119 93 120 }}} 94 121 95 122 === Анализа на подобрување === 96 ||= Метрика ||= Пред ||= По ||= Δ Подобрување ||97 || Execution Time || ___ ms || ___ ms || ___ % ||98 || Scan Type (Тест 2) || Seq Scan || Index Scan || — ||99 123 100 '''Очекувано:''' `idx_drink_rest_id_drink_id` на `drink(rest_id, drink_id)` го поддржува JOIN-от со `restaurant` и директното филтрирање по `rest_id`. На мали датасети планерот може да остане на Seq Scan. Подобрувањето е поизразено при филтрирање по конкретен ресторан. 124 ||= Метрика ||= Пред ||= По ||= Промена (%) || 125 || Execution Time (Тест 1) || ___ ms || ___ ms || ___ % || 126 || Execution Time (Тест 2) || ___ ms || ___ ms || ___ % || 127 128 Промената се пресметува како 100 × (време пред − време по) / време пред, кога почетното време е поголемо од нула. Негативна вредност означува побавно извршување. 129 130 Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење. 131 132 Разлика во времињата кај непроменет сет индекси не е доказ за подобрување од нов индекс.
