wiki:QueryOptimization

Version 3 (modified by 231018, 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;
  1. Примарен филтер за погледот vw_sopstvenici_na_vozila ќе биде според vozilo_id или registarska_oznaka. Погледот ќе се користи за брз приказ на податоци за возило и негов сопственик.
  1. Примарен случај на употреба ќе биде пребарување и преглед на информации за возила и нивните сопственици. За овој поглед перформансите се важни, бидејќи табелите 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 секунди, за овој поглед нема потреба од дополнително индексирање.

Заклучок:

Времето на извршување за овој поглед е прифатливо, па затоа не се поставуваат дополнителни индекси.

Note: See TracWiki for help on using the wiki.