AdvancedTopics: partitioning.sql

File partitioning.sql, 4.4 KB (added by 231069, 7 hours ago)
Line 
1
2-- explain plan za analiza
3EXPLAIN (ANALYZE, BUFFERS)
4SELECT * from Zapisnik
5WHERE datum BETWEEN '2024-03-01' AND '2024-03-31';
6
7
8----dodavanje na datum vo zavisnite tabeli
9
10
11ALTER TABLE Stavka_Zapisnik DISABLE TRIGGER USER;
12
13ALTER TABLE Stavka_Zapisnik ADD COLUMN datum_zapisnik date;
14UPDATE Stavka_Zapisnik sz
15SET datum_zapisnik = z.datum
16FROM Zapisnik z
17WHERE sz.id_na_zapisnik = z.id_na_zapisnik;
18
19ALTER TABLE Stavka_Zapisnik ENABLE TRIGGER USER;
20
21ALTER TABLE Uplata ADD COLUMN datum_zapisnik date;
22UPDATE Uplata u
23SET datum_zapisnik = z.datum
24FROM Zapisnik z
25WHERE u.id_zapisnik = z.id_na_zapisnik;
26
27
28
29
30---drop na constraint za foreign key
31
32ALTER TABLE Stavka_Zapisnik DROP CONSTRAINT IF EXISTS stavka_zapisnik_id_na_zapisnik_fkey;
33ALTER TABLE Uplata DROP CONSTRAINT IF EXISTS uplata_id_zapisnik_fkey;
34
35
36--preimenuvanje na zapisnik
37ALTER TABLE Zapisnik RENAME TO Zapisnik_old;
38
39
40-- ---- particionirana Zapisnik so kompoziten kluc(id_na_zapisnik, datum)
41CREATE TABLE Zapisnik (
42 id_na_zapisnik int,
43 vreme time,
44 datum date NOT NULL,
45 lokacija varchar(100),
46 Potpis boolean DEFAULT false,
47 id_slucaj int,
48 status_zapisnik varchar(20) DEFAULT 'Otvoren' CHECK (status_zapisnik IN ('Otvoren', 'Zatvoren')),
49 EMBG_Prekrsuvach char(13),
50 Vozilo_Broj_Sasija varchar(17),
51 EMBG_Policaec char(13),
52 PRIMARY KEY (id_na_zapisnik, datum),
53 FOREIGN KEY (id_slucaj) REFERENCES Slucaj(id_slucaj) ON UPDATE CASCADE ON DELETE RESTRICT,
54 FOREIGN KEY (EMBG_Prekrsuvach) REFERENCES Gragjanin(EMBG) ON UPDATE CASCADE ON DELETE RESTRICT,
55 FOREIGN KEY (Vozilo_Broj_Sasija) REFERENCES Vozilo(broj_na_sasija) ON UPDATE CASCADE ON DELETE RESTRICT,
56 FOREIGN KEY (EMBG_Policaec) REFERENCES Policaec(EMBG_P) ON UPDATE CASCADE ON DELETE RESTRICT
57) PARTITION BY RANGE (datum);
58
59
60
61CREATE TABLE Zapisnik_2021 PARTITION OF Zapisnik FOR VALUES FROM ('2021-01-01') TO ('2022-01-01');
62CREATE TABLE Zapisnik_2022 PARTITION OF Zapisnik FOR VALUES FROM ('2022-01-01') TO ('2023-01-01');
63CREATE TABLE Zapisnik_2023 PARTITION OF Zapisnik FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
64CREATE TABLE Zapisnik_2024 PARTITION OF Zapisnik FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
65CREATE TABLE Zapisnik_2025 PARTITION OF Zapisnik FOR VALUES FROM ('2025-01-01') TO ('2026-01-01');
66CREATE TABLE Zapisnik_2026 PARTITION OF Zapisnik FOR VALUES FROM ('2026-01-01') TO ('2027-01-01');
67CREATE TABLE Zapisnik_default PARTITION OF Zapisnik DEFAULT;
68
69----migracija na podatocite
70
71INSERT INTO Zapisnik (id_na_zapisnik, vreme, datum, lokacija, Potpis,
72 id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec)
73SELECT id_na_zapisnik, vreme, datum, lokacija, Potpis,
74 id_slucaj, EMBG_Prekrsuvach, Vozilo_Broj_Sasija, EMBG_Policaec
75FROM Zapisnik_old;
76
77ANALYZE Zapisnik;
78
79---- вrakanje na avtomatskata numeracija na id_na_zapisnik
80ALTER TABLE Zapisnik ALTER COLUMN id_na_zapisnik SET DEFAULT nextval('zapisnik_id_na_zapisnik_seq');
81ALTER SEQUENCE zapisnik_id_na_zapisnik_seq OWNED BY Zapisnik.id_na_zapisnik;
82SELECT setval('zapisnik_id_na_zapisnik_seq', (SELECT COALESCE(MAX(id_na_zapisnik), 1) FROM Zapisnik));
83
84
85
86---- Vraten integritetot
87ALTER TABLE Stavka_Zapisnik
88 ADD CONSTRAINT stavka_zapisnik_zapisnik_fk
89 FOREIGN KEY (id_na_zapisnik, datum_zapisnik)
90 REFERENCES Zapisnik (id_na_zapisnik, datum)
91 ON UPDATE CASCADE ON DELETE CASCADE;
92
93
94ALTER TABLE Uplata
95 ADD CONSTRAINT uplata_zapisnik_fk
96 FOREIGN KEY (id_zapisnik, datum_zapisnik)
97 REFERENCES Zapisnik (id_na_zapisnik, datum)
98 ON UPDATE CASCADE ON DELETE RESTRICT;
99
100
101
102
103-- ---- Raspredelba po particii
104SELECT tableoid::regclass AS particija, COUNT(*) AS redovi
105FROM Zapisnik GROUP BY 1 ORDER BY 1;
106
107----Funkcija za avtomatsko kreiranje na particii za ponatamosni godini
108
109CREATE OR REPLACE PROCEDURE avtomatiziraj_particija(p_godina int)
110LANGUAGE plpgsql
111AS $$
112BEGIN
113
114EXECUTE format(
115'CREATE TABLE IF NOT EXISTS Zapisnik_%s PARTITION OF Zapisnik FOR VALUES FROM (%L) TO (%L);',
116p_godina,
117p_godina::text || '-01-01',
118(p_godina + 1)::text || '-01-01'
119);
120RAISE NOTICE 'Партицијата за % година е успешно креирана.', p_godina;
121END;
122$$;
123--povik na funkcijata
124CALL avtomatiziraj_particija(2027);