Changes between Version 4 and Version 5 of AdvancedTopics


Ignore:
Timestamp:
06/16/26 16:02:26 (12 hours ago)
Author:
231025
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedTopics

    v4 v5  
    44За време на развојот на системот, забележавме дека речиси сите наши прегледи и извештаи (на пример, преглед на неплатени казни, анализа на историјата на еден граѓанин или пресметка на активноста на полицајците) секогаш се филтрираат според `datum`, односно бараат податоци за специфичен временски период.
    55
    6 Одлуката да имплементираме партиционирање ја донесовме од два клучни аспекта, директно поврзани со потребите на проектот:
     6Одлуката да имплементираме партиционирање ја донесовме од два клучни аспекти, директно поврзани со потребите на проектот:
    77
    88* '''Подобрување на перформансите:''' Без партиционирање, секогаш кога ќе побараме извештај за еден месец, базата мора да пребара низ сите 10 милиони редови. Со партиционирање, системот ги бара и ги чита само податоците за таа конкретна година.
     
    6565
    6666=== Чекор 4: Нова главна табела ===
    67 Ја креираме новата главна табела со композитниот примарен клуч и ја дефинираме да се партиционира по опсег на датумот (`PARTITION BY RANGE (datum)`).
     67Ја креираме новата главна табела со композитниот примарен клуч и ја дефинираме да се партиционира по опсег на датумот (`PARTITION BY RANGE (datum)`). Ја задржуваме и колоната `status_zapisnik` (заедно со нејзиниот `CHECK` и `DEFAULT`), бидејќи таа е дел од шемата и се користи од процедурата за затворање записник.
    6868{{{
    6969#!sql
     
    7575Potpis             boolean DEFAULT false,
    7676id_slucaj          int,
     77status_zapisnik    varchar(20) DEFAULT 'Otvoren' CHECK (status_zapisnik IN ('Otvoren', 'Zatvoren')),
    7778EMBG_Prekrsuvach   char(13),
    7879Vozilo_Broj_Sasija varchar(17),
     
    100101
    101102=== Чекор 6: Префрлање податоци ===
    102 Ги префрламе сите ~10 милиони редови. Секој ред автоматски се сместува во соодветната табела (партиција).
     103Ги префрламе сите ~10 милиони редови, вклучувајќи ја и колоната `status_zapisnik`. Секој ред автоматски се сместува во соодветната табела (партиција).
    103104{{{
    104105#!sql
    105106INSERT INTO Zapisnik (id_na_zapisnik, vreme, datum, lokacija, Potpis,
    106 id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec)
     107id_slucaj, status_zapisnik, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec)
    107108SELECT id_na_zapisnik, vreme, datum, lokacija, Potpis,
    108 id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec
     109id_slucaj, status_zapisnik, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec
    109110FROM Zapisnik_old;
    110 }}}
    111 
    112 === Чекор 7: Нови надворешни клучеви ===
     111
     112ANALYZE Zapisnik;
     113}}}
     114
     115=== Чекор 7: Враќање на автоматската нумерација ===
     116Колоната `id_na_zapisnik` беше `serial` пред партиционирањето, но новата табела ја дефиниравме како обичен `int`. За процедурите што вметнуваат нови записници (на пр. `kreiraj_zapisnik_so_prekrsok`) повторно да добиваат автоматско `id`, ја поврзуваме колоната со постојната секвенца и ја поставуваме на тековниот максимум за да не се судираат новите вредности.
     117{{{
     118#!sql
     119ALTER TABLE Zapisnik ALTER COLUMN id_na_zapisnik SET DEFAULT nextval('zapisnik_id_na_zapisnik_seq');
     120ALTER SEQUENCE zapisnik_id_na_zapisnik_seq OWNED BY Zapisnik.id_na_zapisnik;
     121SELECT setval('zapisnik_id_na_zapisnik_seq', (SELECT COALESCE(MAX(id_na_zapisnik), 1) FROM Zapisnik));
     122}}}
     123
     124=== Чекор 8: Нови надворешни клучеви ===
    113125Го враќаме интегритетот на базата. Сега `Stavka_Zapisnik` и `Uplata` ги поврзуваме со `Zapisnik` користејќи го композитниот клуч `(id_na_zapisnik, datum)`.
    114126{{{