| 7 | | Во оваа фаза ќе се анализираат плановите на извршување, ќе се утврдат најбавните операции и ќе се изврши оптимизација со помош на индекси и подобрување на прашалниците, со цел системот да обезбеди поефикасно и побрзо извршување при работа со големи количини на податоци. |
| | 7 | Преку користење на ''EXPLAIN ANALYZE'' ќе се анализираат плановите на извршување, ќе се утврдат најбавните операции и ќе се изврши оптимизација со помош на индекси и подобрување на прашалниците, со цел системот да обезбеди поефикасно и побрзо извршување при работа со големи количини на податоци. |
| | 8 | |
| | 9 | |
| | 10 | === Анализа на View3: Сопственици на возила === |
| | 11 | |
| | 12 | Прашалникот кој ќе го тестираме е следниот: |
| | 13 | |
| | 14 | {{{ |
| | 15 | -- 3A: приказ на сите возила заедно со нивните сопственици |
| | 16 | SELECT * |
| | 17 | FROM vw_sopstvenici_na_vozila; |
| | 18 | |
| | 19 | }}} |
| | 20 | |
| | 21 | {{{ |
| | 22 | -- 3B: анализа на планот на извршување |
| | 23 | EXPLAIN ANALYZE |
| | 24 | SELECT * |
| | 25 | FROM vw_sopstvenici_na_vozila; |
| | 26 | }}} |
| | 27 | |
| | 28 | 1. Примарен филтер за погледот `vw_sopstvenici_na_vozila` ќе биде според `vozilo_id` или `registarska_oznaka`. Погледот ќе се користи за брз приказ на податоци за возило и негов сопственик. |
| | 29 | |
| | 30 | 2. Примарен случај на употреба ќе биде пребарување и преглед на информации за возила и нивните сопственици. За овој поглед перформансите се важни, бидејќи табелите `Vozilo`, `Sopstvenik_Vozilo` и `Gragjanin` содржат голем број записи. |
| | 31 | |
| | 32 | = Време на извршување без индекси: = |
| | 33 | |
| | 34 | '''3A - 3 s''' |
| | 35 | |
| | 36 | Прашалникот успешно ги прикажува сите возила заедно со нивните сопственици преку поврзување на табелите `Vozilo`, `Sopstvenik_Vozilo` и `Gragjanin`. |
| | 37 | |
| | 38 | При извршување на прашалникот `SELECT * FROM vw_sopstvenici_na_vozila;`, DataGrip прикажува време на извршување од приближно 3 секунди. Ова време е прифатливо според поставениот критериум дека оптимизација и дополнително индексирање се врши само доколку времето е поголемо од 3 секунди. |
| | 39 | |
| | 40 | Бидејќи прашалникот враќа повеќе од 1.200.000 редови, очекувано е да постои поголемо време на извршување поради количината на податоци што треба да се обработат и прикажат. |
| | 41 | |
| | 42 | '''3B - Анализа на планот на извршување''' |
| | 43 | {{{ |
| | 44 | Gather (cost=102725.44..259522.66 rows=1200350 width=66) |
| | 45 | (actual time=1342.828..1853.740 rows=1200350 loops=1) |
| | 46 | |
| | 47 | Workers Planned: 2 |
| | 48 | Workers Launched: 2 |
| | 49 | |
| | 50 | -> Parallel Hash Join |
| | 51 | (cost=101725.44..138487.66 rows=500146 width=66) |
| | 52 | (actual time=1318.410..1603.201 rows=400117 loops=3) |
| | 53 | |
| | 54 | Hash Cond: (sv.embg = g.embg) |
| | 55 | |
| | 56 | -> Parallel Hash Join |
| | 57 | (cost=26091.54..48846.88 rows=500146 width=40) |
| | 58 | (actual time=410.265..621.322 rows=400117 loops=3) |
| | 59 | |
| | 60 | Hash Cond: (sv.vozilo_id = v.vozilo_id) |
| | 61 | |
| | 62 | -> Parallel Seq Scan on sopstvenik_vozilo sv |
| | 63 | (cost=0.00..12647.46 rows=500146 width=18) |
| | 64 | (actual time=0.048..55.599 rows=400117 loops=3) |
| | 65 | |
| | 66 | -> Parallel Hash |
| | 67 | (cost=17797.13..17797.13 rows=428913 width=26) |
| | 68 | (actual time=243.205..243.206 rows=443210 loops=3) |
| | 69 | |
| | 70 | -> Parallel Seq Scan on vozilo v |
| | 71 | (cost=0.00..17797.13 rows=428913 width=26) |
| | 72 | (actual time=0.051..101.953 rows=443210 loops=3) |
| | 73 | |
| | 74 | -> Parallel Hash |
| | 75 | (cost=64512.62..64512.62 rows=499462 width=54) |
| | 76 | (actual time=521.096..521.097 rows=666570 loops=3) |
| | 77 | |
| | 78 | -> Parallel Seq Scan on gragjanin g |
| | 79 | (cost=0.00..64512.62 rows=499462 width=54) |
| | 80 | (actual time=15.121..235.455 rows=666570 loops=3) |
| | 81 | |
| | 82 | Planning Time: 0.835 ms |
| | 83 | |
| | 84 | Execution Time: 1899.811 ms |
| | 85 | }}} |
| | 86 | |
| | 87 | Од добиениот план на извршување може да се забележи дека PostgreSQL користи `Parallel Seq Scan` врз табелите `sopstvenik_vozilo`, `vozilo` и `gragjanin`. Тоа значи дека системот секвенцијално чита голем број записи од табелите со цел да ги поврзе потребните податоци. |
| | 88 | |
| | 89 | Дополнително, се користат `Parallel Hash Join` операции преку колоните `vozilo_id` и `embg`, што покажува дека PostgreSQL прави hash-based поврзување на големи множества податоци. |
| | 90 | |
| | 91 | Во планот на извршување може да се забележи дека: |
| | 92 | - табелата `sopstvenik_vozilo` враќа околу 400117 редови, |
| | 93 | - табелата `vozilo` враќа околу 443210 редови, |
| | 94 | - табелата `gragjanin` враќа околу 666570 редови. |
| | 95 | |
| | 96 | Поради големиот број записи и отсуството на дополнителни филтри (`WHERE` услови), PostgreSQL мора да обработи повеќе од 1.200.000 редови, што резултира со поголемо време на извршување. |
| | 97 | |
| | 98 | Во планот е прикажано `Execution Time: 1899.811 ms`, односно приближно 1.9 секунди. Разликата помеѓу ова време и времето прикажано во DataGrip (`3 s`) се должи на тоа што DataGrip дополнително го пресметува и времето потребно за прикажување на резултатите во табеларен приказ. |
| | 99 | |
| | 100 | Бидејќи времето на извршување е прифатливо и не го надминува поставениот праг од 3 секунди, за овој поглед нема потреба од дополнително индексирање. |
| | 101 | |
| | 102 | |
| | 103 | |
| | 104 | |
| | 105 | |