Changes between Version 1 and Version 2 of MenuMealIndex


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

--

Legend:

Unmodified
Added
Removed
Modified
  • MenuMealIndex

    v1 v2  
    1 = Индекс: v_menu_meal_index =
     1= Индекси: v_menu_meal_index =
    22
    3 ||= Датотека ||= `indexes/v_menu_meal_index.sql` ||
    4 ||= Шема ||= `kbnteam` ||
    5 ||= Поврзани прегледи ||= `v_menu_meal`, `v_customer_contract_meals`, `v_customer_contract_menu` ||
     3||= Својство ||= Вредност ||
     4|| Шема || `kbnteam` ||
     5|| Област || Мени и каталог ||
     6|| Главен преглед || [wiki:MenuMealView v_menu_meal] ||
    67
    78== Опис ==
    8 Три индекси кои ги забрзуваат CTE агрегациите за состојки и алергени во прегледот `v_menu_meal` и сродните прегледи. Секој индекс таргетира различна табела вклучена во ланецот meal → meal_ingredient → alergen_ingredient.
     9
     10Индексите го поддржуваат пристапот до податоците за мени и каталог. Се поставуваат врз изворните табели и можат да се користат од повеќе прегледи.
     11
     12Уникатното ограничување `uq_meal_restaurant_name` веќе го покрива пребарувањето по ресторан. Обратниот редослед на колоните во индексите за состојки и алергени овозможува пристап од јадење кон состојка и од состојка кон алерген.
    913
    1014== DDL ==
     15
    1116{{{
    1217#!sql
    13 -- indexes/v_menu_meal_index.sql
    14 -- Note: uq_meal_restaurant_name already supports (rest_id, meal_name).
    1518CREATE INDEX IF NOT EXISTS idx_meal_cat_id_meal_id
    1619ON kbnteam.meal (cat_id, meal_id);
    … …  
    2427
    2528== Поддржани прегледи ==
    26 ||= Преглед ||= Индекс ||= Начин на употреба ||
    27 || `v_menu_meal` || `idx_meal_cat_id_meal_id` || WHERE cat_id = ? и JOIN со category ||
    28 || `v_menu_meal` || `idx_meal_ingredient_meal_id_ingr_id` || CTE `meal_ingredients` — JOIN meal_ingredient по meal_id ||
    29 || `v_menu_meal` || `idx_alergen_ingredient_ingr_id_alergen_id` || CTE `meal_allergens` — JOIN alergen_ingredient по ingr_id ||
    30 || `v_customer_contract_meals` || Сите три || Истите CTE шаблони ||
    31 || `v_customer_contract_menu` || Сите три || Посредно преку `v_customer_contract_meals` ||
     29
     30||= Индекс ||= Прегледи ||= Намена ||
     31|| `idx_meal_cat_id_meal_id` || [wiki:MenuMealView v_menu_meal] || Пребарување јадења по категорија. ||
     32|| `idx_meal_ingredient_meal_id_ingr_id` || [wiki:MenuMealView v_menu_meal] || Пристап до состојките на јадењето и групирање по meal_id. ||
     33|| `idx_alergen_ingredient_ingr_id_alergen_id` || [wiki:MenuMealView v_menu_meal] || Пристап до алергените поврзани со состојката. ||
    3234
    3335== Колонски план ==
    34 ||= Индекс ||= Табела ||= Колона 1 ||= Колона 2 ||= Причина ||
    35 || `idx_meal_cat_id_meal_id` || `meal` || `cat_id` (leading) || `meal_id` (covering) || Го поддржува JOIN по категорија и WHERE cat_id филтер ||
    36 || `idx_meal_ingredient_meal_id_ingr_id` || `meal_ingredient` || `meal_id` (leading) || `ingr_id` (covering) || CTE `meal_ingredients`: GROUP BY meal_id, JOIN ingredient по ingr_id ||
    37 || `idx_alergen_ingredient_ingr_id_alergen_id` || `alergen_ingredient` || `ingr_id` (leading) || `alergen_id` (covering) || CTE `meal_allergens`: JOIN alergen_ingredient по ingr_id ||
     36
     37||= Индекс ||= Табела ||= Прва колона ||= Следни колони ||= Намена ||
     38|| `idx_meal_cat_id_meal_id` || `meal` || `cat_id` || `meal_id` || Пребарување јадења по категорија. ||
     39|| `idx_meal_ingredient_meal_id_ingr_id` || `meal_ingredient` || `meal_id` || `ingr_id` || Пристап до состојките на јадењето и групирање по meal_id. ||
     40|| `idx_alergen_ingredient_ingr_id_alergen_id` || `alergen_ingredient` || `ingr_id` || `alergen_id` || Пристап до алергените поврзани со состојката. ||
     41
     42Првата колона го определува вообичаениот почеток на пребарувањето со составен индекс. Присуството на други колони не значи дека индексот ги содржи сите податоци потребни за прегледот.
    3843
    3944== Верификација ==
     45
    4046{{{
    4147#!sql
    42 SELECT indexname, indexdef
     48SELECT tablename, indexname, indexdef
    4349FROM pg_indexes
    4450WHERE schemaname = 'kbnteam'
    4551  AND indexname IN (
    46       'idx_meal_cat_id_meal_id',
    47       'idx_meal_ingredient_meal_id_ingr_id',
    48       'idx_alergen_ingredient_ingr_id_alergen_id'
    49   );
     52    'idx_meal_cat_id_meal_id',
     53    'idx_meal_ingredient_meal_id_ingr_id',
     54    'idx_alergen_ingredient_ingr_id_alergen_id'
     55)
     56ORDER BY tablename, indexname;
    5057}}}
    5158
    52 == Очекувано влијание ==
    53 Трите индекси заедно ги намалуваат Hash Join/Sort операциите во CTE агрегациите. Поголемо подобрување е видливо кога постојат многу оброци и богати листи на состојки и алергени.
     59Проверката ги прикажува имињата и дефинициите. IF NOT EXISTS спречува повторно креирање под исто име, но не проверува дали постојната дефиниција е еднаква на наведената.
     60
     61== Влијание врз перформансите ==
     62
     63Изборот меѓу секвенцијално читање, индексно читање и други планови зависи од обемот на податоците, селективноста на филтрите и статистиките. Индексите не гарантираат забрзување или отстранување на сортирањата и спојувањата. Плановите и времињата се утврдуваат со мерење.
     64
     65== Тестирање на перформанси ==
     66
     67Тест прашалниците за овој преглед се наведени во [wiki:MenuMealView v_menu_meal].
     68
     69=== Резултати пред индексирање ===
     70
     71||= Прашалник ||= Execution Time (ms) ||= План / забелешки ||
     72|| Тест 1: по категорија || ___ || ___ ||
     73|| Тест 2: по ресторан || ___ || ___ ||
     74
     75=== Резултати по индексирање ===
     76
     77||= Прашалник ||= Execution Time (ms) ||= План / забелешки ||
     78|| Тест 1: по категорија || ___ || ___ ||
     79|| Тест 2: по ресторан || ___ || ___ ||