| | 1 | = Индекс: v_menu_meal_index = |
| | 2 | |
| | 3 | ||= Датотека ||= `indexes/v_menu_meal_index.sql` || |
| | 4 | ||= Шема ||= `kbnteam` || |
| | 5 | ||= Поврзани прегледи ||= `v_menu_meal`, `v_customer_contract_meals`, `v_customer_contract_menu` || |
| | 6 | |
| | 7 | == Опис == |
| | 8 | Три индекси кои ги забрзуваат CTE агрегациите за состојки и алергени во прегледот `v_menu_meal` и сродните прегледи. Секој индекс таргетира различна табела вклучена во ланецот meal → meal_ingredient → alergen_ingredient. |
| | 9 | |
| | 10 | == DDL == |
| | 11 | {{{ |
| | 12 | #!sql |
| | 13 | -- indexes/v_menu_meal_index.sql |
| | 14 | -- Note: uq_meal_restaurant_name already supports (rest_id, meal_name). |
| | 15 | CREATE INDEX IF NOT EXISTS idx_meal_cat_id_meal_id |
| | 16 | ON kbnteam.meal (cat_id, meal_id); |
| | 17 | |
| | 18 | CREATE INDEX IF NOT EXISTS idx_meal_ingredient_meal_id_ingr_id |
| | 19 | ON kbnteam.meal_ingredient (meal_id, ingr_id); |
| | 20 | |
| | 21 | CREATE INDEX IF NOT EXISTS idx_alergen_ingredient_ingr_id_alergen_id |
| | 22 | ON kbnteam.alergen_ingredient (ingr_id, alergen_id); |
| | 23 | }}} |
| | 24 | |
| | 25 | == Поддржани прегледи == |
| | 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` || |
| | 32 | |
| | 33 | == Колонски план == |
| | 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 || |
| | 38 | |
| | 39 | == Верификација == |
| | 40 | {{{ |
| | 41 | #!sql |
| | 42 | SELECT indexname, indexdef |
| | 43 | FROM pg_indexes |
| | 44 | WHERE schemaname = 'kbnteam' |
| | 45 | 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 | ); |
| | 50 | }}} |
| | 51 | |
| | 52 | == Очекувано влијание == |
| | 53 | Трите индекси заедно ги намалуваат Hash Join/Sort операциите во CTE агрегациите. Поголемо подобрување е видливо кога постојат многу оброци и богати листи на состојки и алергени. |