| Version 3 (modified by , 20 hours ago) ( diff ) |
|---|
Оптимизација на прашалници и погледи
Во оваа фаза ќе се изврши анализа и оптимизација на погледите дефинирани во претходната фаза преку прашалници базирани на реални сценарија кои би се користеле во рамки на системот Safe City Security.
Целта е да се испитаат перформансите при пребарување и обработка на податоци поврзани со прекршоци, возила, казни, камери и корисници, како и да се идентификуваат потенцијални проблеми при извршување на прашалниците.
Преку користење на EXPLAIN ANALYZE ќе се анализираат плановите на извршување, ќе се утврдат најбавните операции и ќе се изврши оптимизација со помош на индекси и подобрување на прашалниците, со цел системот да обезбеди поефикасно и побрзо извршување при работа со големи количини на податоци.
Анализа на View3: Сопственици на возила
Прашалниците кои ќе ги тестираме се следните:
-- 3A: приказ на сите возила заедно со нивните сопственици SELECT * FROM vw_sopstvenici_na_vozila; -- 3B: анализа на планот на извршување EXPLAIN ANALYZE SELECT * FROM vw_sopstvenici_na_vozila;
- Примарен филтер за погледот
vw_sopstvenici_na_vozilaќе биде споредvozilo_idилиregistarska_oznaka. Погледот ќе се користи за брз приказ на податоци за возило и негов сопственик.
- Примарен случај на употреба ќе биде пребарување и преглед на информации за возила и нивните сопственици. За овој поглед перформансите се важни, бидејќи табелите
Vozilo,Sopstvenik_VoziloиGragjaninсодржат голем број записи.
Време на извршување без индекси:
3A - 3 s
Прашалникот успешно ги прикажува сите возила заедно со нивните сопственици преку поврзување на табелите Vozilo, Sopstvenik_Vozilo и Gragjanin.
При извршување на прашалникот SELECT * FROM vw_sopstvenici_na_vozila;, DataGrip прикажува време на извршување од приближно 3 секунди. Ова време е прифатливо според поставениот критериум дека оптимизација и дополнително индексирање се врши само доколку времето е поголемо од 3 секунди.
Бидејќи прашалникот враќа повеќе од 1.200.000 редови, очекувано е да постои поголемо време на извршување поради количината на податоци што треба да се обработат и прикажат.
3B - 1904.498 ms
Gather (cost=107243.47..264426.69 rows=1200350 width=66) (actual time=1347.925..1858.566 rows=1200350 loops=1)
Workers Planned: 2
Workers Launched: 2
-> Parallel Hash Join (cost=106243.47..143391.69 rows=500146 width=66) (actual time=1328.027..1605.452 rows=400117 loops=3)
Hash Cond: (sv.embg = g.embg)
-> Parallel Hash Join (cost=30609.57..53750.91 rows=500146 width=40) (actual time=433.942..644.238 rows=400117 loops=3)
Hash Cond: (sv.vozilo_id = v.vozilo_id)
-> Parallel Seq Scan on sopstvenik_vozilo sv (cost=0.00..12647.46 rows=500146 width=18) (actual time=0.046..54.985 rows=400117 loops=3)
-> Parallel Hash (cost=21223.03..21223.03 rows=485403 width=26) (actual time=267.048..267.049 rows=443210 loops=3)
Buckets: 131072 Batches: 16 Memory Usage: 6144kB
-> Parallel Seq Scan on vozilo v (cost=0.00..21223.03 rows=485403 width=26) (actual time=0.063..124.396 rows=443210 loops=3)
-> Parallel Hash (cost=64512.62..64512.62 rows=499462 width=54) (actual time=505.717..505.718 rows=666570 loops=3)
Buckets: 131072 Batches: 32 Memory Usage: 6592kB
-> Parallel Seq Scan on gragjanin g (cost=0.00..64512.62 rows=499462 width=54) (actual time=14.767..217.461 rows=666570 loops=3)
Planning Time: 0.846 ms
JIT:
Functions: 54
" Options: Inlining false, Optimization false, Expressions true, Deforming true"
" Timing: Generation 4.132 ms (Deform 2.153 ms), Inlining 0.000 ms, Optimization 2.183 ms, Emission 42.395 ms, Total 48.710 ms"
Execution Time: 1904.498 ms
Од добиениот план на извршување може да се забележи дека PostgreSQL користи Parallel Seq Scan врз табелите sopstvenik_vozilo, vozilo и gragjanin. Тоа значи дека системот секвенцијално чита голем број записи од табелите со цел да ги поврзе потребните податоци.
Дополнително, се користат Parallel Hash Join операции преку колоните vozilo_id и embg, што покажува дека PostgreSQL прави hash-based поврзување на големи множества податоци.
Во планот на извршување може да се забележи дека:
- табелата
sopstvenik_voziloвраќа околу 400117 редови, - табелата
voziloвраќа околу 443210 редови, - табелата
gragjaninвраќа околу 666570 редови.
Поради големиот број записи и отсуството на дополнителни филтри (WHERE услови), PostgreSQL мора да обработи повеќе од 1.200.000 редови, што резултира со поголемо време на извршување.
Во планот е прикажано Execution Time: 1899.811 ms, односно приближно 1.9 секунди. Разликата помеѓу ова време и времето прикажано во DataGrip (3 s) се должи на тоа што DataGrip дополнително го пресметува и времето потребно за прикажување на резултатите во табеларен приказ.
Бидејќи времето на извршување е прифатливо и не го надминува поставениот праг од 3 секунди, за овој поглед нема потреба од дополнително индексирање.
Заклучок:
Времето на извршување за овој поглед е прифатливо, па затоа не се поставуваат дополнителни индекси.
