| | 1 | == Query Optimization == |
| | 2 | |
| | 3 | === Оптимизација на погледи === |
| | 4 | |
| | 5 | ==== all_recipes ==== |
| | 6 | Овој поглед се користи за прикажување на сите рецепти во системот, најчесто без филтри или со pagination. Бидејќи не користи JOIN или WHERE услови, не се применуваат индекси. |
| | 7 | |
| | 8 | Време на извршување: |
| | 9 | * Пред оптимизација: ~200-400 ms |
| | 10 | * После оптимизација: ~200 ms |
| | 11 | * Заклучок: Прифатливо време, не е потребна оптимизација. |
| | 12 | |
| | 13 | |
| | 14 | ==== recipe_details ==== |
| | 15 | Се користи за прикажување на детални информации за рецепт, заедно со кујната. Често се користи со филтри по recipe id или cuisine. |
| | 16 | |
| | 17 | Време на извршување: |
| | 18 | * Пред оптимизација: ~800-1500 ms |
| | 19 | * После оптимизација: ~50-120 ms |
| | 20 | |
| | 21 | Explain plan (пред): |
| | 22 | * Seq Scan на табелата recipe |
| | 23 | * Nested Loop Join со cuisine |
| | 24 | |
| | 25 | Оптимизација: |
| | 26 | {{{ |
| | 27 | CREATE INDEX idx_recipe_cuisine_id ON recipe(cuisine_id); |
| | 28 | }}} |
| | 29 | |
| | 30 | Explain plan (после): |
| | 31 | * Index Scan на recipe |
| | 32 | * Hash Join |
| | 33 | |
| | 34 | Заклучок: Значително подобрување, времето е прифатливо. |
| | 35 | |
| | 36 | |
| | 37 | ==== recipe_ingredients_view ==== |
| | 38 | Се користи за прикажување на состојки за даден рецепт, најчесто со филтер по recipe_id. |
| | 39 | |
| | 40 | Време на извршување: |
| | 41 | * Пред оптимизација: 3-8 секунди |
| | 42 | * После оптимизација: 50-200 ms |
| | 43 | |
| | 44 | Explain plan (пред): |
| | 45 | * Seq Scan на recipe_ingredient (10M записи) |
| | 46 | |
| | 47 | Оптимизација: |
| | 48 | {{{ |
| | 49 | CREATE INDEX idx_recipe_ingredient_recipe_id ON recipe_ingredient(recipe_id); |
| | 50 | CREATE INDEX idx_recipe_ingredient_ingredient_id ON recipe_ingredient(ingredient_id); |
| | 51 | }}} |
| | 52 | |
| | 53 | Explain plan (после): |
| | 54 | * Index Scan + Nested Loop |
| | 55 | |
| | 56 | Заклучок: Големо подобрување поради големината на табелата. |
| | 57 | |
| | 58 | |
| | 59 | ==== recipe_reviews_view ==== |
| | 60 | Се користи за приказ на оценки и коментари за рецепти, со филтри по recipe или user. |
| | 61 | |
| | 62 | Време на извршување: |
| | 63 | * Пред оптимизација: 2-5 секунди |
| | 64 | * После оптимизација: 50-150 ms |
| | 65 | |
| | 66 | Оптимизација: |
| | 67 | {{{ |
| | 68 | CREATE INDEX idx_recipe_review_recipe_id ON recipe_review(recipe_id); |
| | 69 | CREATE INDEX idx_recipe_review_user_id ON recipe_review(user_id); |
| | 70 | }}} |
| | 71 | |
| | 72 | Заклучок: Значително намалување на времето. |
| | 73 | |
| | 74 | |
| | 75 | ==== user_favorites_view ==== |
| | 76 | Се користи за прикажување на омилени рецепти за даден корисник. |
| | 77 | |
| | 78 | Време на извршување: |
| | 79 | * Пред оптимизација: 1-3 секунди |
| | 80 | * После оптимизација: 30-100 ms |
| | 81 | |
| | 82 | Оптимизација: |
| | 83 | {{{ |
| | 84 | CREATE INDEX idx_recipe_favorite_user_id ON recipe_favorite(user_id); |
| | 85 | CREATE INDEX idx_recipe_favorite_recipe_id ON recipe_favorite(recipe_id); |
| | 86 | }}} |
| | 87 | |
| | 88 | Заклучок: Прифатливо време по оптимизација. |
| | 89 | |
| | 90 | |
| | 91 | ==== quick_recipes ==== |
| | 92 | Се користи за прикажување на рецепти со време на подготовка <= 30 минути. |
| | 93 | |
| | 94 | Време на извршување: |
| | 95 | * Пред оптимизација: 500-1000 ms |
| | 96 | * После оптимизација: 20-80 ms |
| | 97 | |
| | 98 | Оптимизација: |
| | 99 | {{{ |
| | 100 | CREATE INDEX idx_recipe_total_time ON recipe(total_time); |
| | 101 | }}} |
| | 102 | |
| | 103 | Заклучок: Филтрирањето значително се подобрува со индекс. |
| | 104 | |
| | 105 | |
| | 106 | ==== forum_posts_view ==== |
| | 107 | Се користи за прикажување на форум постови заедно со корисник. |
| | 108 | |
| | 109 | Време на извршување: |
| | 110 | * Пред оптимизација: 1-2 секунди |
| | 111 | * После оптимизација: 50-150 ms |
| | 112 | |
| | 113 | Оптимизација: |
| | 114 | {{{ |
| | 115 | CREATE INDEX idx_forumpost_user_id ON forumpost(user_id); |
| | 116 | CREATE INDEX idx_forumpost_created_at ON forumpost(created_at); |
| | 117 | }}} |
| | 118 | |
| | 119 | Заклучок: Подобрени перформанси при прикажување и сортирање. |
| | 120 | |
| | 121 | |
| | 122 | ==== recipe_categories_view ==== |
| | 123 | Се користи за прикажување категории на рецепти. |
| | 124 | |
| | 125 | Време на извршување: |
| | 126 | * Пред оптимизација: 1-3 секунди |
| | 127 | * После оптимизација: 50-150 ms |
| | 128 | |
| | 129 | Оптимизација: |
| | 130 | {{{ |
| | 131 | CREATE INDEX idx_recipe_category_recipe_id ON recipe_category(recipe_id); |
| | 132 | CREATE INDEX idx_recipe_category_category_id ON recipe_category(category_id); |
| | 133 | }}} |
| | 134 | |
| | 135 | Заклучок: Значително подобрување поради join операциите. |
| | 136 | |
| | 137 | |
| | 138 | === Заклучок === |
| | 139 | |
| | 140 | Оптимизацијата на погледите со користење на индекси доведе до значително подобрување на перформансите, особено кај табели со голем број записи (10M+). Времето на извршување се намали од неколку секунди на милисекунди, што е прифатливо за продукциски систем. За погледи без филтри и join операции, индексите немаат значително влијание. |