Changes between Version 6 and Version 7 of QueryOptimization


Ignore:
Timestamp:
06/13/26 01:22:04 (4 days ago)
Author:
231025
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v6 v7  
    5757}}}
    5858
    59 === Поглед 4: v_povtoreni_prekrsoci ===
     59=== Поглед 4: v_povtoreni_prekrsoci_mv ===
    6060'''Граѓани што повторуваат ист тип прекршок (`COUNT > 1`) — колку пати, прв и последен пат, вкупен износ казни.'''[[BR]]
    6161Се пребарува по: `EMBG`.
    6262{{{#!sql
    63 CREATE OR REPLACE VIEW v_povtoreni_prekrsoci AS
     63CREATE MATERIALIZED VIEW v_povtoreni_prekrsoci_mv AS
    6464WITH Prekrsoci_Stats AS (
    6565    SELECT z.EMBG_Prekrsuvach, sz.id_na_prekrsok,
     
    8080}}}
    8181
    82 === Поглед 5: v_policaici_prosek_zapisnici ===
     82=== Поглед 5: v_policaici_prosek_zapisnici_mv ===
    8383'''Статистики по полицаец: вкупно записници, прв/последен, активни месеци и просечен број записници по месец.'''[[BR]]
    8484Се пребарува по: `EMBG_P` (дополнително по име на станица).
    8585{{{#!sql
    86 CREATE OR REPLACE VIEW v_policaici_prosek_zapisnici AS
     86CREATE MATERIALIZED VIEW v_policaici_prosek_zapisnici_mv AS
    8787WITH Policaec_Stats AS (
    8888    SELECT EMBG_Policaec, COUNT(id_na_zapisnik) AS vkupno_zapisnici,
     
    103103}}}
    104104
    105 === Поглед 6: v_istorija_gragjanin ===
     105=== Поглед 6: v_istorija_gragjanin_mv ===
    106106'''Целосен профил на граѓанин: вкупно прекршоци, платено, долг, прв/последен прекршок и број различни типови.'''[[BR]]
    107107Се пребарува по: `EMBG`.
    108108{{{#!sql
    109 CREATE OR REPLACE VIEW v_istorija_gragjanin AS
     109CREATE MATERIALIZED VIEW v_istorija_gragjanin_mv AS
    110110WITH Zapisnik_Stats AS (
    111111    SELECT EMBG_Prekrsuvach,
     
    144144[[BR]]
    145145== 2. Оптимизација ==
    146 За секој поглед го измеривме почетното време, ја идентификувавме најбавната операција и применивме оптимизација. Кај пребарувањата по клуч тоа е индекс, а кај аналитичките погледи — материјализација.
     146За секој поглед го измеривме почетното време преку `EXPLAIN ANALYZE`, ја идентификувавме најбавната операција и применивме оптимизација. Кај пребарувањата по клуч тоа е индекс, а кај аналитичките погледи — материјализација.
    147147
    148148=== Поглед 1 — v_site_zapisnici ===
     
    204204[[Image(view3-index.png, 700px)]]
    205205
    206 === Поглед 4 — v_povtoreni_prekrsoci ===
    207 Аналитички поглед. План: `GROUP BY` / `HashAggregate` над цела `Zapisnik` — агрегацијата ги поминува сите редови, индекс не помага. Затоа го материјализираме (`_mv`); резултатот се пресметува еднаш и се чита готов:
    208 {{{#!sql
    209 DROP VIEW v_povtoreni_prekrsoci;
    210 
    211 CREATE MATERIALIZED VIEW v_povtoreni_prekrsoci_mv AS
    212 -- ista definicija kako vo del 1
    213 ...;
    214 }}}
    215 
    216 '''Прашалник кој го тестираме:'''
    217 {{{#!sql
    218 -- testirame za graganin so EMBG = '0412992470302'
    219 SELECT * FROM v_povtoreni_prekrsoci_mv WHERE embg = '0412992470302';
    220 }}}
    221 
     206=== Поглед 4 — v_povtoreni_prekrsoci_mv ===
     207Аналитички поглед — `GROUP BY` / `HashAggregate` над цела `Zapisnik`, па индекс не помага. Решение: материјализација (дефиницијата е во делот Погледи).
     208
     209'''Прашалник кој го тестираме:'''
     210{{{#!sql
     211-- testirame za graganin so ime = 'Виолета'
     212SELECT * FROM v_povtoreni_prekrsoci_mv WHERE ime = 'Виолета';
     213}}}
     214
     215'''Пред''' (обичен аналитички поглед)[[BR]]
     216време на извршување: 1m8s
    222217[[Image(view4.png, 700px)]]
    223218
    224 '''Време на извршување:''' градењето (`REFRESH`) трае ~4,917s; потоа читањето по `EMBG` е речиси моментално.
    225 
    226 === Поглед 5 — v_policaici_prosek_zapisnici ===
    227 Аналитички поглед. План: агрегација (`COUNT`, `MIN`, `MAX`) групирана по полицаец над цела `Zapisnik` — индекс не носи добивка. Затоа го материјализираме (`_mv`):
    228 {{{#!sql
    229 DROP VIEW v_policaici_prosek_zapisnici;
    230 
    231 CREATE MATERIALIZED VIEW v_policaici_prosek_zapisnici_mv AS
    232 -- ista definicija kako vo del 1
    233 ...;
    234 }}}
    235 
    236 '''Прашалник кој го тестираме:'''
    237 {{{#!sql
    238 -- testirame za policaec so EMBG = '3007982480021'
    239 SELECT * FROM v_policaici_prosek_zapisnici_mv WHERE embg_p = '3007982480021';
    240 }}}
    241 
     219'''Потоа''' (материјализиран поглед)[[BR]]
     220Со материјализиран поглед добиваме 388ms време на читање.
     221[[Image(view4-materialized.png, 700px)]]
     222Освежувањето (`REFRESH`) трае 1m27s.
     223{{{#!sql
     224REFRESH MATERIALIZED VIEW v_povtoreni_prekrsoci_mv;
     225}}}
     226
     227=== Поглед 5 — v_policaici_prosek_zapisnici_mv ===
     228Аналитички поглед — агрегација (`COUNT`, `MIN`, `MAX`) групирана по полицаец над цела `Zapisnik`, индекс не носи добивка. Решение: материјализација (дефиницијата е во делот Погледи).
     229
     230'''Прашалник кој го тестираме:'''
     231{{{#!sql
     232-- testirame za policaec so ime = 'Никола'
     233SELECT * FROM v_policaici_prosek_zapisnici_mv WHERE policaec_ime = 'Никола';
     234}}}
     235
     236'''Пред''' (обичен аналитички поглед)[[BR]]
     237време на извршување: 1,5s
    242238[[Image(view5.png, 700px)]]
    243239
    244 '''Време на извршување:''' градењето (`REFRESH`) трае ~3,234s; потоа читањето по `EMBG_P` е речиси моментално.
    245 
    246 === Поглед 6 — v_istorija_gragjanin ===
    247 Аналитички поглед. План: две одделни агрегации (над `Zapisnik`/`Stavka_Zapisnik` и над `Uplata`) па join — двете страни се скенираат во целост. Затоа го материјализираме (`_mv`):
    248 {{{#!sql
    249 DROP VIEW v_istorija_gragjanin;
    250 
    251 CREATE MATERIALIZED VIEW v_istorija_gragjanin_mv AS
    252 -- ista definicija kako vo del 1
    253 ...;
    254 }}}
    255 
    256 '''Прашалник кој го тестираме:'''
    257 {{{#!sql
    258 -- testirame za graganin so EMBG = '0412992470302'
    259 SELECT * FROM v_istorija_gragjanin_mv WHERE embg = '0412992470302';
    260 }}}
    261 
     240'''Потоа''' (материјализиран поглед)[[BR]]
     241Со материјализиран поглед добиваме <1s време на читање.
     242[[Image(view5-materialized.png, 700px)]]
     243Освежувањето (`REFRESH`) трае <2s.
     244{{{#!sql
     245REFRESH MATERIALIZED VIEW v_policaici_prosek_zapisnici_mv;
     246}}}
     247
     248=== Поглед 6 — v_istorija_gragjanin_mv ===
     249Аналитички поглед — две одделни агрегации (над `Zapisnik`/`Stavka_Zapisnik` и над `Uplata`) па join, двете страни се скенираат во целост. Решение: материјализација (дефиницијата е во делот Погледи).
     250
     251'''Прашалник кој го тестираме:'''
     252{{{#!sql
     253-- testirame za graganin so ime = 'Оливера'
     254SELECT * FROM v_istorija_gragjanin_mv WHERE ime = 'Оливера';
     255}}}
     256
     257'''Пред''' (обичен аналитички поглед)[[BR]]
     258време на извршување: 1m33s
    262259[[Image(view6.png, 700px)]]
    263260
    264 '''Време на извршување:''' градењето (`REFRESH`) трае ~9,076s; потоа читањето по `EMBG` е речиси моментално.
     261'''Потоа''' (материјализиран поглед)[[BR]]
     262Со материјализиран поглед добиваме <1s време на читање.
     263[[Image(view6-materialized.png, 700px)]]
     264Освежувањето (`REFRESH`) трае 2m17s.
     265{{{#!sql
     266REFRESH MATERIALIZED VIEW v_istorija_gragjanin_mv;
     267}}}
    265268
    266269
     
    271274|| v_zapisnici_detalno || 5m59s || ~154ms || индекс ||
    272275|| v_neplateni_kazni || 6,922s || ~121ms || постоечки индекс ||
    273 || v_povtoreni_prekrsoci || ~4,917s || брзо* || материјализиран поглед ||
    274 || v_policaici_prosek_zapisnici || ~3,234s || брзо* || материјализиран поглед ||
    275 || v_istorija_gragjanin || ~9,076s || брзо* || материјализиран поглед ||
    276 
    277 '''*''' читањето од материјализиран поглед е речиси моментално; наведеното време е еднократната цена на градењето/освежувањето (`REFRESH`).
     276|| v_povtoreni_prekrsoci_mv || 1m8s || 388ms || материјализиран поглед ||
     277|| v_policaici_prosek_zapisnici_mv || 1,5s || <1s || материјализиран поглед ||
     278|| v_istorija_gragjanin_mv || 1m33s || <1s || материјализиран поглед ||
     279
     280Кај материјализираните, „По" е времето на читање; освежувањето (`REFRESH`) трае 1m27s (поглед 4), <2s (поглед 5) и 2m17s (поглед 6).