== Query Optimization == === Оптимизација на погледи === [attachment:QueryOptimization.pdf Query Optimization Report] ==== all_recipes ==== Овој поглед се користи за прикажување на сите рецепти во системот, најчесто без филтри или со pagination. Бидејќи не користи JOIN или WHERE услови, не се применуваат индекси. Време на извршување: * Пред оптимизација: ~200-400 ms * После оптимизација: ~200 ms * Заклучок: Прифатливо време, не е потребна оптимизација. ==== recipe_details ==== Се користи за прикажување на детални информации за рецепт, заедно со кујната. Често се користи со филтри по recipe id или cuisine. Време на извршување: * Пред оптимизација: ~800-1500 ms * После оптимизација: ~50-120 ms Explain plan (пред): * Seq Scan на табелата recipe * Nested Loop Join со cuisine Оптимизација: {{{ CREATE INDEX idx_recipe_cuisine_id ON recipe(cuisine_id); }}} Explain plan (после): * Index Scan на recipe * Hash Join Заклучок: Значително подобрување, времето е прифатливо. ==== recipe_ingredients_view ==== Се користи за прикажување на состојки за даден рецепт, најчесто со филтер по recipe_id. Време на извршување: * Пред оптимизација: 3-8 секунди * После оптимизација: 50-200 ms Explain plan (пред): * Seq Scan на recipe_ingredient (10M записи) Оптимизација: {{{ CREATE INDEX idx_recipe_ingredient_recipe_id ON recipe_ingredient(recipe_id); CREATE INDEX idx_recipe_ingredient_ingredient_id ON recipe_ingredient(ingredient_id); }}} Explain plan (после): * Index Scan + Nested Loop Заклучок: Големо подобрување поради големината на табелата. ==== recipe_reviews_view ==== Се користи за приказ на оценки и коментари за рецепти, со филтри по recipe или user. Време на извршување: * Пред оптимизација: 2-5 секунди * После оптимизација: 50-150 ms Оптимизација: {{{ CREATE INDEX idx_recipe_review_recipe_id ON recipe_review(recipe_id); CREATE INDEX idx_recipe_review_user_id ON recipe_review(user_id); }}} Заклучок: Значително намалување на времето. ==== user_favorites_view ==== Се користи за прикажување на омилени рецепти за даден корисник. Време на извршување: * Пред оптимизација: 1-3 секунди * После оптимизација: 30-100 ms Оптимизација: {{{ CREATE INDEX idx_recipe_favorite_user_id ON recipe_favorite(user_id); CREATE INDEX idx_recipe_favorite_recipe_id ON recipe_favorite(recipe_id); }}} Заклучок: Прифатливо време по оптимизација. ==== quick_recipes ==== Се користи за прикажување на рецепти со време на подготовка <= 30 минути. Време на извршување: * Пред оптимизација: 500-1000 ms * После оптимизација: 20-80 ms Оптимизација: {{{ CREATE INDEX idx_recipe_total_time ON recipe(total_time); }}} Заклучок: Филтрирањето значително се подобрува со индекс. ==== forum_posts_view ==== Се користи за прикажување на форум постови заедно со корисник. Време на извршување: * Пред оптимизација: 1-2 секунди * После оптимизација: 50-150 ms Оптимизација: {{{ CREATE INDEX idx_forumpost_user_id ON forumpost(user_id); CREATE INDEX idx_forumpost_created_at ON forumpost(created_at); }}} Заклучок: Подобрени перформанси при прикажување и сортирање. ==== recipe_categories_view ==== Се користи за прикажување категории на рецепти. Време на извршување: * Пред оптимизација: 1-3 секунди * После оптимизација: 50-150 ms Оптимизација: {{{ CREATE INDEX idx_recipe_category_recipe_id ON recipe_category(recipe_id); CREATE INDEX idx_recipe_category_category_id ON recipe_category(category_id); }}} Заклучок: Значително подобрување поради join операциите. === Заклучок === Оптимизацијата на погледите со користење на индекси доведе до значително подобрување на перформансите, особено кај табели со голем број записи (10M+). Времето на извршување се намали од неколку секунди на милисекунди, што е прифатливо за продукциски систем. За погледи без филтри и join операции, индексите немаат значително влијание.