Changes between Version 2 and Version 3 of MenuDrinkView


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

--

Legend:

Unmodified
Added
Removed
Modified
  • MenuDrinkView

    v2 v3  
    11= Преглед: v_menu_drink =
    22
    3 ||= Датотека ||= `views/01_menu_drink_view.sql` ||
    4 ||= Шема ||= `kbnteam` ||
    5 ||= Категорија ||= Мени и Каталог ||
    6 ||= Поврзани индекси ||= `indexes/v_menu_drink_index.sql` ||
     3||= Својство ||= Вредност ||
     4|| Шема || `kbnteam` ||
     5|| Категорија || Мени и каталог ||
     6|| Поврзани индекси || Примарни и уникатни клучеви ||
    77
    88== Опис ==
    9 Едноставен преглед кој ги наведува сите пијачи достапни на секој ресторан заедно со деталите за ресторанот. Се користи за прелистување на мени и нарачки преку веб апликацијата.
     9
     10Ги прикажува пијалоците, нивната количина и цена, како и ресторанот.
     11
     12Едноставно спојување на `drink` и `restaurant`, без агрегации.
     13
     14Еден ред за секој пијалак. Менито не се ограничува според активноста на договорите.
    1015
    1116== Зависности ==
    12 ||= Табела ||= Тип на употреба ||
    13 || `kbnteam.drink` || Главна табела — ги содржи деталите за пијачот ||
    14 || `kbnteam.restaurant` || JOIN — ги додава деталите за ресторанот ||
     17
     18||= Табела / преглед ||= Употреба ||
     19|| `kbnteam.drink` || Пијалоци, количини, цени и ресторан. ||
     20|| `kbnteam.restaurant` || Податоци за рестораните. ||
    1521
    1622== Излезни колони ==
    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` || Назив на ресторанот ||
    2423
    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
    2634{{{
    2735#!sql
    … …  
    4048== Тестирање на перформанси ==
    4149
    42 === Препорачано тест прашање ===
     50Примерите користат илустративни идентификатори и датуми. За споредливи мерења се избираат вредности што постојат во базата и се задржуваат истите податоци, филтри, услови за кеширање и број на повторувања. Статистиките за табелите треба да бидат ажурирани во двете состојби.
     51
     52=== Тест прашалници ===
     53
    4354{{{
    4455#!sql
    45 SET search_path TO kbnteam;
    46 SET statement_timeout = '60s';
     56BEGIN READ ONLY;
     57SET LOCAL statement_timeout = '60s';
    4758
    48 -- Тест 1: целосен скен на прегледот
     59-- Тест 1: целосен преглед
    4960EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
    5061SELECT * FROM kbnteam.v_menu_drink;
    5162
    52 -- Тест 2: филтрирање по ресторан (препорачано за мерење на индексот)
     63-- Тест 2: по ресторан
    5364EXPLAIN (ANALYZE, BUFFERS, VERBOSE)
    5465SELECT * FROM kbnteam.v_menu_drink
    5566WHERE rest_id = 1;
     67
     68ROLLBACK;
    5669}}}
    5770
    5871=== Резултати пред индексирање ===
    59 Извршете ги горните прашања '''пред''' да ја примените датотеката `indexes/v_menu_drink_index.sql`.
    6072
    61 ||= Метрика ||= Тест 1 (целосен скен) ||= Тест 2 (по rest_id) ||
     73Основната состојба ги задржува индексите на примарните клучеви и уникатните ограничувања. Останатите присутни индекси се евидентираат одделно. При споредба на заеднички индекси се користи истата почетна состојба за секој преглед.
     74
     75||= Метрика ||= Тест 1 (целосен преглед) ||= Тест 2 (по ресторан) ||
    6276|| Planning Time || ___ ms || ___ ms ||
    6377|| Execution Time || ___ ms || ___ ms ||
    6478|| Rows Returned || ___ || ___ ||
    65 || Scan Type || ___ || ___ ||
     79|| Начин на читање по табела || ___ || ___ ||
     80|| Shared Hit Blocks || ___ || ___ ||
     81|| Shared Read Blocks || ___ || ___ ||
    6682
    6783{{{
    68 -- Излезот од EXPLAIN ANALYZE овде (пред индексирање)
     84-- Планови и резултати пред дополнителното индексирање:
     85
    6986}}}
    7087
    71 === Применети индекси ===
     88=== Дополнителни и заеднички индекси ===
     89
     90`drink(rest_id, drink_name)` е покриен со уникатното ограничување `uq_drink_restaurant_name`, а `restaurant(rest_id)` со примарен клуч. За овој преглед нема дополнителен индекс.
     91
     92Нема дополнителна CREATE INDEX наредба за овој преглед. Двете мерења го користат истото основно покривање со индекси.
     93
     94=== Проверка на индексите ===
     95
    7296{{{
    7397#!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);
     98SELECT tablename, indexname, indexdef
     99FROM pg_indexes
     100WHERE schemaname = 'kbnteam'
     101  AND tablename IN ('drink', 'restaurant')
     102ORDER BY tablename, indexname;
    80103}}}
    81104
    82105=== Резултати по индексирање ===
    83 Извршете ги истите прашања '''по''' примена на `indexes/v_menu_drink_index.sql`.
    84106
    85 ||= Метрика ||= Тест 1 (целосен скен) ||= Тест 2 (по rest_id) ||
     107Мерењето ги користи истите тест прашалници и услови како почетното мерење.
     108
     109||= Метрика ||= Тест 1 (целосен преглед) ||= Тест 2 (по ресторан) ||
    86110|| Planning Time || ___ ms || ___ ms ||
    87111|| Execution Time || ___ ms || ___ ms ||
    88112|| Rows Returned || ___ || ___ ||
    89 || Scan Type || ___ || ___ ||
     113|| Начин на читање по табела || ___ || ___ ||
     114|| Shared Hit Blocks || ___ || ___ ||
     115|| Shared Read Blocks || ___ || ___ ||
    90116
    91117{{{
    92 -- Излезот од EXPLAIN ANALYZE овде (по индексирање)
     118-- Планови и резултати по дополнителното индексирање:
     119
    93120}}}
    94121
    95122=== Анализа на подобрување ===
    96 ||= Метрика ||= Пред ||= По ||= Δ Подобрување ||
    97 || Execution Time || ___ ms || ___ ms || ___ % ||
    98 || Scan Type (Тест 2) || Seq Scan || Index Scan || — ||
    99123
    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Разлика во времињата кај непроменет сет индекси не е доказ за подобрување од нов индекс.