Changes between Version 4 and Version 5 of AdvancedTopics
- Timestamp:
- 06/16/26 16:02:26 (12 hours ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AdvancedTopics
v4 v5 4 4 За време на развојот на системот, забележавме дека речиси сите наши прегледи и извештаи (на пример, преглед на неплатени казни, анализа на историјата на еден граѓанин или пресметка на активноста на полицајците) секогаш се филтрираат според `datum`, односно бараат податоци за специфичен временски период. 5 5 6 Одлуката да имплементираме партиционирање ја донесовме од два клучни аспект а, директно поврзани со потребите на проектот:6 Одлуката да имплементираме партиционирање ја донесовме од два клучни аспекти, директно поврзани со потребите на проектот: 7 7 8 8 * '''Подобрување на перформансите:''' Без партиционирање, секогаш кога ќе побараме извештај за еден месец, базата мора да пребара низ сите 10 милиони редови. Со партиционирање, системот ги бара и ги чита само податоците за таа конкретна година. … … 65 65 66 66 === Чекор 4: Нова главна табела === 67 Ја креираме новата главна табела со композитниот примарен клуч и ја дефинираме да се партиционира по опсег на датумот (`PARTITION BY RANGE (datum)`). 67 Ја креираме новата главна табела со композитниот примарен клуч и ја дефинираме да се партиционира по опсег на датумот (`PARTITION BY RANGE (datum)`). Ја задржуваме и колоната `status_zapisnik` (заедно со нејзиниот `CHECK` и `DEFAULT`), бидејќи таа е дел од шемата и се користи од процедурата за затворање записник. 68 68 {{{ 69 69 #!sql … … 75 75 Potpis boolean DEFAULT false, 76 76 id_slucaj int, 77 status_zapisnik varchar(20) DEFAULT 'Otvoren' CHECK (status_zapisnik IN ('Otvoren', 'Zatvoren')), 77 78 EMBG_Prekrsuvach char(13), 78 79 Vozilo_Broj_Sasija varchar(17), … … 100 101 101 102 === Чекор 6: Префрлање податоци === 102 Ги префрламе сите ~10 милиони редови . Секој ред автоматски се сместува во соодветната табела (партиција).103 Ги префрламе сите ~10 милиони редови, вклучувајќи ја и колоната `status_zapisnik`. Секој ред автоматски се сместува во соодветната табела (партиција). 103 104 {{{ 104 105 #!sql 105 106 INSERT INTO Zapisnik (id_na_zapisnik, vreme, datum, lokacija, Potpis, 106 id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec)107 id_slucaj, status_zapisnik, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec) 107 108 SELECT id_na_zapisnik, vreme, datum, lokacija, Potpis, 108 id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec109 id_slucaj, status_zapisnik, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec 109 110 FROM Zapisnik_old; 110 }}} 111 112 === Чекор 7: Нови надворешни клучеви === 111 112 ANALYZE Zapisnik; 113 }}} 114 115 === Чекор 7: Враќање на автоматската нумерација === 116 Колоната `id_na_zapisnik` беше `serial` пред партиционирањето, но новата табела ја дефиниравме како обичен `int`. За процедурите што вметнуваат нови записници (на пр. `kreiraj_zapisnik_so_prekrsok`) повторно да добиваат автоматско `id`, ја поврзуваме колоната со постојната секвенца и ја поставуваме на тековниот максимум за да не се судираат новите вредности. 117 {{{ 118 #!sql 119 ALTER TABLE Zapisnik ALTER COLUMN id_na_zapisnik SET DEFAULT nextval('zapisnik_id_na_zapisnik_seq'); 120 ALTER SEQUENCE zapisnik_id_na_zapisnik_seq OWNED BY Zapisnik.id_na_zapisnik; 121 SELECT setval('zapisnik_id_na_zapisnik_seq', (SELECT COALESCE(MAX(id_na_zapisnik), 1) FROM Zapisnik)); 122 }}} 123 124 === Чекор 8: Нови надворешни клучеви === 113 125 Го враќаме интегритетот на базата. Сега `Stavka_Zapisnik` и `Uplata` ги поврзуваме со `Zapisnik` користејќи го композитниот клуч `(id_na_zapisnik, datum)`. 114 126 {{{
