Changes between Version 2 and Version 3 of QueryOptimization


Ignore:
Timestamp:
05/20/26 12:11:21 (6 days ago)
Author:
231118
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v2 v3  
    44[attachment:QueryOptimization.pdf Query Optimization Report]
    55
    6 
    76==== all_recipes ====
    8 Овој поглед се користи за прикажување на сите рецепти во системот, најчесто без филтри или со pagination. Бидејќи не користи JOIN или WHERE услови, не се применуваат индекси.
    9 
    10 Време на извршување:
     7
     81. Случај на употреба:
     9Овој поглед се користи за прикажување на сите рецепти во системот, најчесто без филтри или со pagination.
     10
     112. Бидејќи погледот не користи JOIN или WHERE услови, базата не користи дополнителни индекси при извршување.
     12
     133. Иницијално извршување на погледот.
     14
     154. Времето изминато во извршување на операциите insert и update изнесува:
    1116 * Пред оптимизација: ~200-400 ms
    12  * После оптимизација: ~200 ms
    13  * Заклучок: Прифатливо време, не е потребна оптимизација.
     17
     185. Заклучок:
     19Времето на извршување е прифатливо и не е потребна дополнителна оптимизација.
    1420
    1521
    1622==== recipe_details ====
    17 Се користи за прикажување на детални информации за рецепт, заедно со кујната. Често се користи со филтри по recipe id или cuisine.
    18 
    19 Време на извршување:
    20  * Пред оптимизација: ~800-1500 ms
    21  * После оптимизација: ~50-120 ms
    22 
    23 Explain plan (пред):
     23
     241. Случај на употреба:
     25Овој поглед се користи кога корисникот сака да ги види целосните информации за еден рецепт. Перформансите се клучни бидејќи ова е една од најчесто користените страни.
     26
     272. Примарен филтер за овој поглед е recipe_id, додека исто така може да се пребарува и по cuisine_id.
     28
     293. Иницијално извршување на погледот.
     30
     314. Explain plan (пред оптимизација):
    2432 * Seq Scan на табелата recipe
    25  * Nested Loop Join со cuisine
    26 
    27 Оптимизација:
    28 {{{
    29 CREATE INDEX idx_recipe_cuisine_id ON recipe(cuisine_id);
    30 }}}
    31 
    32 Explain plan (после):
    33  * Index Scan на recipe
     33 * Nested Loop Left Join со cuisine
     34 * Execution Time: ~173 ms
     35
     365. Времето изминато во извршување на операциите insert и update изнесува:
     37 * INSERT: ~351 ms
     38 * UPDATE: ~500 ms
     39
     406. Оптимизација:
     41Со цел да се забрза спојувањето на табелите и филтрирањето по тип на кујна, се додава индекс на cuisine_id.
     42
     43{{{
     44CREATE INDEX IF NOT EXISTS idx_recipe_cuisine_id
     45ON recipe(cuisine_id);
     46}}}
     47
     487. Explain plan (после оптимизација):
     49 * Bitmap Heap Scan
     50 * Bitmap Index Scan using idx_recipe_cuisine_id
     51 * Execution Time: ~19 ms
     52
     538. Времето изминато во извршување на операциите insert и update по индексирање изнесува:
     54 * INSERT: ~136 ms
     55 * UPDATE: ~302 ms
     56
     579. Заклучок:
     58Со додавање индекс на cuisine_id значително се подобри времето на извршување и пребарувањето по кујна се извршува многу побрзо.
     59
     60==== recipe_ingredients_view ====
     61
     621. Секогаш кога некој ќе отвори рецепт, базата мора да ги повлече сите негови состојки. Ова повлекува JOIN операции помеѓу табелите recipe, ingredient и recipe_ingredient.
     63
     642. Иницијално извршување на погледот.
     65
     663. Explain plan (пред оптимизација):
     67 * Nested Loop Join
     68 * Index Scan using recipe_ingredient_pkey
     69 * Execution Time: ~0.125 ms
     70
     714. Времето изминато во извршување на операциите insert и update изнесува:
     72 * INSERT: ~112 ms
     73 * UPDATE: ~131 ms
     74
     755. Оптимизација:
     76Овие погледи ги поврзуваат рецептите со нивните состојки. Користењето на индекси на надворешните клучеви во табелата recipe_ingredient ги оптимизира JOIN операциите.
     77
     78{{{
     79CREATE INDEX IF NOT EXISTS idx_recipe_ingredient_recipe_id
     80ON recipe_ingredient(recipe_id);
     81
     82CREATE INDEX IF NOT EXISTS idx_recipe_ingredient_ingredient_id
     83ON recipe_ingredient(ingredient_id);
     84}}}
     85
     866. Explain plan (после оптимизација):
     87 * Nested Loop Join
     88 * Index Scan using recipe_ingredient_pkey
     89 * Execution Time: ~0.571 ms
     90
     917. Иако беа креирани дополнителни индекси над колоните recipe_id и ingredient_id, не се забележува значителна промена во execution plan-от. Причината е што базата веќе користи постоечки индекси при извршување на JOIN операциите.
     92
     938. Времето изминато во извршување на операциите insert и update по индексирање изнесува:
     94 * INSERT: ~210 ms
     95 * UPDATE: ~85 ms
     96
     979. Заклучок:
     98Иако нема значително подобрување во execution plan-от, индексирањето на надворешните клучеви претставува добра практика за оптимизација на JOIN операции кај поголеми табели.
     99
     100==== recipe_reviews_view ====
     101
     1021. Примарен филтер:
     103Примарен филтер за овој поглед е recipe_id (за прикажување на сите оцени за еден рецепт), а секундарен филтер е user_id (за преглед на сите рецензии оставени од еден корисник).
     104
     1052. Случај на употреба:
     106Овој поглед е од витално значење за социјалниот аспект на системот. Корисниците се потпираат на оцените и искуствата на другите корисници пред да одлучат да подготват рецепт. Доколку вчитувањето на рецензиите е бавно, корисникот може да ја напушти страницата.
     107
     1083. Иницијално извршување на погледот.
     109
     1104. Explain plan (пред оптимизација):
     111 * Nested Loop Join
     112 * Seq Scan на recipe_review
     113 * Execution Time: ~484 ms за recipe_id
     114 * Execution Time: ~0.151 ms за user_id
     115
     1165. Времето изминато во извршување на операциите insert и update изнесува:
     117 * INSERT: ~161 ms
     118 * UPDATE по recipe_id: ~130 ms
     119 * UPDATE по recipe_id и user_id: ~149 ms
     120
     1216. Оптимизација:
     122Со цел да се забрза извршувањето се креираат индекси на recipe_id и user_id.
     123
     124{{{
     125CREATE INDEX IF NOT EXISTS idx_recipe_review_recipe_id
     126ON recipe_review(recipe_id);
     127
     128CREATE INDEX IF NOT EXISTS idx_recipe_review_user_id
     129ON recipe_review(user_id);
     130}}}
     131
     1327. Explain plan (после оптимизација):
     133 * Bitmap Heap Scan
     134 * Bitmap Index Scan using idx_recipe_review_recipe_id
     135 * Index Scan using recipe_review_user_id_recipe_id_key
     136 * Execution Time: ~6.487 ms
     137
     1388. Времето изминато во извршување на операциите insert и update по индексирање изнесува:
     139 * INSERT: ~170 ms
     140 * UPDATE: ~150 ms
     141
     1429. Заклучок:
     143Со додавање индекси на recipe_id и user_id значително се подобри пребарувањето и вчитувањето на рецензиите.
     144
     145
     146==== user_favorites_view ====
     147
     1481. Примарен филтер за овој поглед е user_id.
     149
     1502. Случај на употреба:
     151Корисниците сакаат брзо да ги видат своите омилени рецепти и најчесто зачуваните рецепти во системот.
     152
     1533. Иницијално извршување на погледот.
     154
     1554. Explain plan (пред оптимизација):
     156 * Nested Loop Join
     157 * Seq Scan на recipe_favorite
    34158 * Hash Join
    35 
    36 Заклучок: Значително подобрување, времето е прифатливо.
    37 
    38 
    39 ==== recipe_ingredients_view ====
    40 Се користи за прикажување на состојки за даден рецепт, најчесто со филтер по recipe_id.
    41 
    42 Време на извршување:
    43  * Пред оптимизација: 3-8 секунди
    44  * После оптимизација: 50-200 ms
    45 
    46 Explain plan (пред):
    47  * Seq Scan на recipe_ingredient (10M записи)
    48 
    49 Оптимизација:
    50 {{{
    51 CREATE INDEX idx_recipe_ingredient_recipe_id ON recipe_ingredient(recipe_id);
    52 CREATE INDEX idx_recipe_ingredient_ingredient_id ON recipe_ingredient(ingredient_id);
    53 }}}
    54 
    55 Explain plan (после):
    56  * Index Scan + Nested Loop
    57 
    58 Заклучок: Големо подобрување поради големината на табелата.
    59 
    60 
    61 ==== recipe_reviews_view ====
    62 Се користи за приказ на оценки и коментари за рецепти, со филтри по recipe или user.
    63 
    64 Време на извршување:
    65  * Пред оптимизација: 2-5 секунди
    66  * После оптимизација: 50-150 ms
    67 
    68 Оптимизација:
    69 {{{
    70 CREATE INDEX idx_recipe_review_recipe_id ON recipe_review(recipe_id);
    71 CREATE INDEX idx_recipe_review_user_id ON recipe_review(user_id);
    72 }}}
    73 
    74 Заклучок: Значително намалување на времето.
    75 
    76 
    77 ==== user_favorites_view ====
    78 Се користи за прикажување на омилени рецепти за даден корисник.
    79 
    80 Време на извршување:
    81  * Пред оптимизација: 1-3 секунди
    82  * После оптимизација: 30-100 ms
    83 
    84 Оптимизација:
    85 {{{
    86 CREATE INDEX idx_recipe_favorite_user_id ON recipe_favorite(user_id);
    87 CREATE INDEX idx_recipe_favorite_recipe_id ON recipe_favorite(recipe_id);
    88 }}}
    89 
    90 Заклучок: Прифатливо време по оптимизација.
     159 * Execution Time: ~97 ms при пребарување по recipe_id
     160 * Execution Time: ~0.199 ms при пребарување по user_id
     161
     162Базата користи recipe_favorite_pkey за основни пребарувања по корисник.
     163
     1645. Времето изминато во извршување на операциите insert и update изнесува:
     165 * INSERT: ~170 ms
     166 * UPDATE: ~224 ms
     167
     1686. Оптимизација:
     169Со цел да се забрза извршувањето се креираат индекси на recipe_id и user_id.
     170
     171{{{
     172CREATE INDEX idx_recipe_favorite_user_id
     173ON recipe_favorite(user_id);
     174
     175CREATE INDEX idx_recipe_favorite_recipe_id
     176ON recipe_favorite(recipe_id);
     177}}}
     178
     1797. Explain plan (после оптимизација):
     180 * Bitmap Heap Scan
     181 * Bitmap Index Scan using idx_recipe_favorite_recipe_id
     182 * Index Only Scan using recipe_favorite_pkey
     183 * Execution Time: ~8.197 ms
     184
     1858. Времето изминато во извршување на операциите insert и update по индексирање изнесува:
     186 * INSERT: ~79 ms
     187 * UPDATE: ~97 ms
     188
     1899. Заклучок:
     190Со индексирање на колоните recipe_id и user_id значително се подобри пребарувањето на омилени рецепти и се намали времето на извршување.
    91191
    92192
    93193==== quick_recipes ====
    94 Се користи за прикажување на рецепти со време на подготовка <= 30 минути.
    95 
    96 Време на извршување:
    97  * Пред оптимизација: 500-1000 ms
    98  * После оптимизација: 20-80 ms
    99 
    100 Оптимизација:
    101 {{{
    102 CREATE INDEX idx_recipe_total_time ON recipe(total_time);
    103 }}}
    104 
    105 Заклучок: Филтрирањето значително се подобрува со индекс.
     194
     1951. Примарен филтер за овој поглед е total_time.
     196
     1972. Случај на употреба:
     198Корисниците често пребаруваат "брзи рецепти" кои се готови за под 30 минути.
     199
     2003. Проблем:
     201Се извршува Seq Scan на табелата recipe при пребарување и сортирање според total_time.
     202
     2034. Иницијално извршување на погледот.
     204
     2055. Explain plan (пред оптимизација):
     206 * Seq Scan на recipe
     207 * Sort operation по total_time
     208 * Execution Time: ~79 ms
     209
     2106. Времето изминато во извршување на операциите insert и update изнесува:
     211 * INSERT: ~242 ms
     212 * UPDATE: ~1.188 s
     213
     2147. Оптимизација:
     215За да може базата брзо да ги подреди и филтрира рецептите според времето на подготовка, се додава индекс на колоната total_time.
     216
     217{{{
     218CREATE INDEX IF NOT EXISTS idx_recipe_total_time
     219ON recipe(total_time);
     220}}}
     221
     2228. Explain plan (после оптимизација):
     223 * Bitmap Heap Scan
     224 * Bitmap Index Scan using idx_recipe_total_time
     225 * Execution Time: ~42 ms
     226
     2279. Времето изминато во извршување на операциите insert и update по индексирање изнесува:
     228 * INSERT: ~148 ms
     229 * UPDATE: ~2.989 s
     230
     23110. Заклучок:
     232Со индексирање на total_time значително се подобри пребарувањето и сортирањето на брзи рецепти.
    106233
    107234
    108235==== forum_posts_view ====
    109 Се користи за прикажување на форум постови заедно со корисник.
    110 
    111 Време на извршување:
    112  * Пред оптимизација: 1-2 секунди
    113  * После оптимизација: 50-150 ms
    114 
    115 Оптимизација:
    116 {{{
    117 CREATE INDEX idx_forumpost_user_id ON forumpost(user_id);
    118 CREATE INDEX idx_forumpost_created_at ON forumpost(created_at);
    119 }}}
    120 
    121 Заклучок: Подобрени перформанси при прикажување и сортирање.
     236
     2371. Примарен филтер за погледот forum_posts_view е user_id.
     238
     2392. Случај на употреба:
     240Погледот се користи за прикажување форум објави и пребарување на објави според корисник и датум.
     241
     2423. Иницијално извршување на погледот.
     243
     2444. Explain plan (пред оптимизација):
     245 * Gather operation
     246 * Parallel Seq Scan на forumpost
     247 * Nested Loop Left Join
     248 * Execution Time: ~3752 ms за user_id
     249 * Execution Time: ~4291 ms за user_id и created_at
     250
     2515. Времето изминато во извршување на операциите insert и update изнесува:
     252 * INSERT: ~288 ms
     253 * UPDATE по id: ~64 ms
     254 * Масовен UPDATE: ~14.10 s
     255
     2566. Оптимизација:
     257Со цел да се забрза извршувањето се креираат индекси на user_id и created_at.
     258
     259{{{
     260CREATE INDEX idx_forumpost_user_id
     261ON forumpost(user_id);
     262
     263CREATE INDEX idx_forumpost_created_at
     264ON forumpost(created_at);
     265}}}
     266
     2677. Explain plan (после оптимизација):
     268 * Bitmap Heap Scan
     269 * Bitmap Index Scan using idx_forumpost_user_id
     270 * Bitmap Index Scan using idx_forumpost_created_at
     271 * Execution Time: ~0.211 ms
     272 * Execution Time: ~0.415 ms
     273
     2748. Времето изминато во извршување на операциите insert и update по индексирање изнесува:
     275 * INSERT: ~96 ms
     276 * UPDATE: ~160 ms
     277
     2789. Заклучок:
     279Со индексирање на user_id и created_at значително се подобри пребарувањето и филтрирањето на форум објавите.
    122280
    123281
    124282==== recipe_categories_view ====
    125 Се користи за прикажување категории на рецепти.
    126 
    127 Време на извршување:
    128  * Пред оптимизација: 1-3 секунди
    129  * После оптимизација: 50-150 ms
    130 
    131 Оптимизација:
    132 {{{
    133 CREATE INDEX idx_recipe_category_recipe_id ON recipe_category(recipe_id);
    134 CREATE INDEX idx_recipe_category_category_id ON recipe_category(category_id);
    135 }}}
    136 
    137 Заклучок: Значително подобрување поради join операциите.
    138 
    139 
    140 === Заклучок ===
    141 
    142 Оптимизацијата на погледите со користење на индекси доведе до значително подобрување на перформансите, особено кај табели со голем број записи (10M+). Времето на извршување се намали од неколку секунди на милисекунди, што е прифатливо за продукциски систем. За погледи без филтри и join операции, индексите немаат значително влијание.
     283
     2841. Примарен филтер за погледот recipe_categories_view е според recipe_id и category_id.
     285
     2862. Случај на употреба:
     287Погледот се користи за прикажување категории на рецепти и пребарување рецепти според категорија.
     288
     2893. Иницијално извршување на погледот.
     290
     2914. Explain plan (пред оптимизација):
     292 * Nested Loop Join
     293 * Parallel Seq Scan на recipe_category
     294 * Hash Join
     295 * Execution Time: ~61 ms за пребарување по category_id
     296 * Execution Time: ~0.277 ms за пребарување по recipe_id
     297
     2985. Времето изминато во извршување на операциите insert и update изнесува:
     299 * INSERT: ~160 ms
     300 * UPDATE: ~302 ms
     301
     3026. Оптимизација:
     303Со цел да се забрза извршувањето се креираат индекси на recipe_id и category_id.
     304
     305{{{
     306CREATE INDEX idx_recipe_category_recipe_id
     307ON recipe_category(recipe_id);
     308
     309CREATE INDEX idx_recipe_category_category_id
     310ON recipe_category(category_id);
     311}}}
     312
     3137. Explain plan (после оптимизација):
     314 * Bitmap Heap Scan
     315 * Bitmap Index Scan using idx_recipe_category_category_id
     316 * Index Only Scan using recipe_category_pkey
     317 * Execution Time: ~225 ms за category_id
     318 * Execution Time: ~0.341 ms за recipe_id
     319
     3208. Времето изминато во извршување на операциите insert и update по индексирање изнесува:
     321 * INSERT: ~117 ms
     322 * UPDATE: ~159 ms
     323
     3249. Заклучок:
     325Со индексирање на recipe_id и category_id се подобри пребарувањето и JOIN операциите кај категориите на рецепти.