= Индекс: v_menu_meal_index = ||= Датотека ||= `indexes/v_menu_meal_index.sql` || ||= Шема ||= `kbnteam` || ||= Поврзани прегледи ||= `v_menu_meal`, `v_customer_contract_meals`, `v_customer_contract_menu` || == Опис == Три индекси кои ги забрзуваат CTE агрегациите за состојки и алергени во прегледот `v_menu_meal` и сродните прегледи. Секој индекс таргетира различна табела вклучена во ланецот meal → meal_ingredient → alergen_ingredient. == DDL == {{{ #!sql -- indexes/v_menu_meal_index.sql -- Note: uq_meal_restaurant_name already supports (rest_id, meal_name). CREATE INDEX IF NOT EXISTS idx_meal_cat_id_meal_id ON kbnteam.meal (cat_id, meal_id); CREATE INDEX IF NOT EXISTS idx_meal_ingredient_meal_id_ingr_id ON kbnteam.meal_ingredient (meal_id, ingr_id); CREATE INDEX IF NOT EXISTS idx_alergen_ingredient_ingr_id_alergen_id ON kbnteam.alergen_ingredient (ingr_id, alergen_id); }}} == Поддржани прегледи == ||= Преглед ||= Индекс ||= Начин на употреба || || `v_menu_meal` || `idx_meal_cat_id_meal_id` || WHERE cat_id = ? и JOIN со category || || `v_menu_meal` || `idx_meal_ingredient_meal_id_ingr_id` || CTE `meal_ingredients` — JOIN meal_ingredient по meal_id || || `v_menu_meal` || `idx_alergen_ingredient_ingr_id_alergen_id` || CTE `meal_allergens` — JOIN alergen_ingredient по ingr_id || || `v_customer_contract_meals` || Сите три || Истите CTE шаблони || || `v_customer_contract_menu` || Сите три || Посредно преку `v_customer_contract_meals` || == Колонски план == ||= Индекс ||= Табела ||= Колона 1 ||= Колона 2 ||= Причина || || `idx_meal_cat_id_meal_id` || `meal` || `cat_id` (leading) || `meal_id` (covering) || Го поддржува JOIN по категорија и WHERE cat_id филтер || || `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 || || `idx_alergen_ingredient_ingr_id_alergen_id` || `alergen_ingredient` || `ingr_id` (leading) || `alergen_id` (covering) || CTE `meal_allergens`: JOIN alergen_ingredient по ingr_id || == Верификација == {{{ #!sql SELECT indexname, indexdef FROM pg_indexes WHERE schemaname = 'kbnteam' AND indexname IN ( 'idx_meal_cat_id_meal_id', 'idx_meal_ingredient_meal_id_ingr_id', 'idx_alergen_ingredient_ingr_id_alergen_id' ); }}} == Очекувано влијание == Трите индекси заедно ги намалуваат Hash Join/Sort операциите во CTE агрегациите. Поголемо подобрување е видливо кога постојат многу оброци и богати листи на состојки и алергени.