Changes between Version 9 and Version 10 of OtherTopics


Ignore:
Timestamp:
09/23/26 19:09:04 (3 days ago)
Author:
192063
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • OtherTopics

    v9 v10  
    159159== Перформанси ==
    160160
    161 = Сценарио 1 - Преглед на присуство за ученик - полугодишно=
     161= Сценарио 1 - Преглед на присуство за ученик - полугодишно =
    162162
    163163Во распоредот за часови, може да имаме 7 часа дневно, 5 дена во неделата. Тоа се 35 часа неделно или 140 часа месечно.
    … …  
    167167Но, доколку класниот раководител или родителот сака да го види присуството за едно полугодие за ученикот, тогаш мора да се пребара низ огромна табела.
    168168
    169 **SQL Query за прво полугодие:**
     169**SQL Query за прво полугодие за околу 30 ученици:**
    170170
    171171{{{
    … …  
    203203**Анализирање:**
    204204
    205 
    206 
    207 
    208 
    209 
    210 
    211 
    212 
    213 
    214 
     205{{{
     206Sort  (cost=699.80..701.65 rows=737 width=863) (actual time=3.782..3.831 rows=736 loops=1)
     207  Sort Key: p.datum DESC
     208  Sort Method: quicksort  Memory: 167kB
     209  ->  Nested Loop  (cost=11.67..664.70 rows=737 width=863) (actual time=0.107..3.410 rows=736 loops=1)
     210        ->  Hash Join  (cost=11.51..637.59 rows=737 width=726) (actual time=0.094..2.957 rows=736 loops=1)
     211              Hash Cond: (p.evidentiranood_id = k.id)
     212              ->  Nested Loop  (cost=0.16..624.17 rows=737 width=95) (actual time=0.059..2.692 rows=736 loops=1)
     213                    ->  Seq Scan on prisustvo p  (cost=0.00..601.99 rows=737 width=79) (actual time=0.033..2.300 rows=736 loops=1)
     214                          Filter: ((datum >= '2026-09-01'::date) AND (datum <= '2026-12-31'::date) AND (seodnesuvanaucenikot_id = '18d82d24-9d9f-4c0b-9692-f7a87174cb4c'::uuid))
     215                          Rows Removed by Filter: 17435
     216                    ->  Memoize  (cost=0.16..0.25 rows=1 width=16) (actual time=0.000..0.000 rows=1 loops=736)
     217                          Cache Key: p.evidentiranood_id
     218                          Cache Mode: logical
     219                          Hits: 721  Misses: 15  Evictions: 0  Overflows: 0  Memory Usage: 2kB
     220                          ->  Index Only Scan using nastavnik_pkey on nastavnik n  (cost=0.15..0.24 rows=1 width=16) (actual time=0.002..0.002 rows=1 loops=15)
     221                                Index Cond: (id = p.evidentiranood_id)
     222                                Heap Fetches: 15
     223              ->  Hash  (cost=10.60..10.60 rows=60 width=663) (actual time=0.026..0.027 rows=26 loops=1)
     224                    Buckets: 1024  Batches: 1  Memory Usage: 11kB
     225                    ->  Seq Scan on korisnik k  (cost=0.00..10.60 rows=60 width=663) (actual time=0.010..0.016 rows=26 loops=1)
     226        ->  Memoize  (cost=0.16..0.24 rows=1 width=153) (actual time=0.000..0.000 rows=1 loops=736)
     227              Cache Key: p.zacasot_id
     228              Cache Mode: logical
     229              Hits: 699  Misses: 37  Evictions: 0  Overflows: 0  Memory Usage: 7kB
     230              ->  Index Scan using cas_pkey on cas c  (cost=0.15..0.23 rows=1 width=153) (actual time=0.001..0.001 rows=1 loops=37)
     231                    Index Cond: (id = p.zacasot_id)
     232Planning Time: 0.436 ms
     233Execution Time: 3.960 ms
     234}}}
     235
     236Можеме да видиме дека
     237* Planning Time е: 0.436 ms
     238* Execution Time: 3.960 ms
     239* Начин на скенирање: Seq Scan
     240* Се користи quick sort алгоритам
     241* Се користи index за наставникот кој го внел присуството: evidentiranood_id
     242* Се користи index за часот за кој е присуството.
     243
     244= Предложени индекси =
     2451. Индекс за филтрирање на ученикот и датумот
     246{{{
     247CREATE INDEX idx_prisustvo_ucenik_datum
     248ON prisustvo (seOdnesuvaNaUcenikot_Id, datum DESC);
     249}}}
     2502. Индекси за наставникот, но и за часот
     251{{{
     252CREATE INDEX idx_prisustvo_evidentiranood ON prisustvo (evidentiranoOd_Id);
     253CREATE INDEX idx_prisustvo_zacasot      ON prisustvo (zaCasot_Id);
     254}}}
     255
     256**Анализа после додавање на индексите:
     257**
     258
     259{{{
     260Sort  (cost=357.31..359.15 rows=737 width=176) (actual time=1.400..1.452 rows=736 loops=1)
     261  Sort Key: p.datum DESC
     262  Sort Method: quicksort  Memory: 167kB
     263  ->  Hash Join  (cost=18.53..322.21 rows=737 width=176) (actual time=0.154..0.992 rows=736 loops=1)
     264        Hash Cond: (p.zacasot_id = c.id)
     265        ->  Hash Join  (cost=16.67..318.21 rows=737 width=138) (actual time=0.115..0.714 rows=736 loops=1)
     266              Hash Cond: (p.evidentiranood_id = k.id)
     267              ->  Hash Join  (cost=15.09..314.38 rows=737 width=95) (actual time=0.081..0.446 rows=736 loops=1)
     268                    Hash Cond: (p.evidentiranood_id = n.id)
     269                    ->  Bitmap Heap Scan on prisustvo p  (cost=13.68..310.58 rows=737 width=79) (actual time=0.058..0.187 rows=736 loops=1)
     270                          Recheck Cond: ((seodnesuvanaucenikot_id = '18d82d24-9d9f-4c0b-9692-f7a87174cb4c'::uuid) AND (datum >= '2026-09-01'::date) AND (datum <= '2026-12-31'::date))
     271                          Heap Blocks: exact=12
     272                          ->  Bitmap Index Scan on idx_prisustvo_ucenik_datum  (cost=0.00..13.50 rows=737 width=0) (actual time=0.044..0.045 rows=736 loops=1)
     273                                Index Cond: ((seodnesuvanaucenikot_id = '18d82d24-9d9f-4c0b-9692-f7a87174cb4c'::uuid) AND (datum >= '2026-09-01'::date) AND (datum <= '2026-12-31'::date))
     274                    ->  Hash  (cost=1.18..1.18 rows=18 width=16) (actual time=0.013..0.014 rows=18 loops=1)
     275                          Buckets: 1024  Batches: 1  Memory Usage: 9kB
     276                          ->  Seq Scan on nastavnik n  (cost=0.00..1.18 rows=18 width=16) (actual time=0.006..0.009 rows=18 loops=1)
     277              ->  Hash  (cost=1.26..1.26 rows=26 width=75) (actual time=0.027..0.028 rows=26 loops=1)
     278                    Buckets: 1024  Batches: 1  Memory Usage: 11kB
     279                    ->  Seq Scan on korisnik k  (cost=0.00..1.26 rows=26 width=75) (actual time=0.010..0.017 rows=26 loops=1)
     280        ->  Hash  (cost=1.38..1.38 rows=38 width=54) (actual time=0.032..0.032 rows=38 loops=1)
     281              Buckets: 1024  Batches: 1  Memory Usage: 12kB
     282              ->  Seq Scan on cas c  (cost=0.00..1.38 rows=38 width=54) (actual time=0.016..0.021 rows=38 loops=1)
     283Planning Time: 0.832 ms
     284Execution Time: 1.548 ms
     285}}}
     286
     287Може да се забележи:
     288* Planning Time: 0.832 ms
     289* Execution Time: 1.548 ms
     290* Bitmap Index Scan, Bitmap Heap Scan
     291* Се користи индексот: idx_prisustvo_ucenik_datum
     292* Немаме rows removed
     293
     294** Заклучок **
     295Можеме да забележиме дека времето на извршување се намали за 2 милисекунди. Овој пример работи само на ~30 ученици. Но доколку имаме повеќе тогаш перформансите би биле подобри. Исто така немаме тргање на редици, при филтрирањето, туку се зимаат тие што се потребни.
     296
     297
     298= Сценарио 1 - Плаќање преку metamusk =
     299
     300
     301
     302
     303
     304
     305
     306
     307
     308
     309
     310
     311