Changes between Version 1 and Version 2 of AdvancedTopics
- Timestamp:
- 06/16/26 19:12:46 (3 days ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
AdvancedTopics
v1 v2 3 3 == Декларативно партиционирање на податоци 4 4 5 Со цел да се обезбеди висока скалабилност на системот и оптимални перформанси при експоненцијален раст на податоците, во овој проект имплементиравме декларативно партиционирање на најоптоварените трансакциски табели: Message и Mentorship. Бидејќи овие табели содржат податоци кои природно растат низ времето, искористена е стратегијата RANGE Partitioning, каде податоците се логички поделени врз основа на нивниот датум на креирање (Timestamp за пораки и CreatedAt за менторства).5 Со цел да се обезбеди висока скалабилност на системот и оптимални перформанси при експоненцијален раст на податоците, во овој проект имплементиравме декларативно партиционирање на најоптоварените трансакциски табели: Message и Mentorship. Бидејќи овие табели содржат податоци кои природно растат низ времето, искористена е стратегијата RANGE Partitioning, каде податоците се логички поделени врз основа на нивниот датум на креирање (Timestamp за пораки и CreatedAt за менторства). 6 6 7 7 За да не се наруши интегритетот на постоечките податоци, креирани се паралелни партиционирани табели (Mentorship_Partitioned и Message_Partitioned). За овие табели дефинирани се следните физички партиции: 8 8 9 -Годишни партиции: изолирани физички табели за тековниот и идниот оперативен период на факултетот (за 2024, 2025 и 2026 година). Ова овозможува лесно архивирање на старите податоци во иднина.10 - DEFAULT партиција: како безбедносен механизам, креирани се табелите mentorship_future и message_future. Сите податоци чиј датум не припаѓа во експлицитно дефинираните години ќе бидат рутирани тука, со што се спречува системско паѓање при внес на непланирани датуми.9 * Годишни партиции: изолирани физички табели за тековниот и идниот оперативен период на факултетот (за 2024, 2025 и 2026 година). Ова овозможува лесно архивирање на старите податоци во иднина. 10 * DEFAULT партиција: како безбедносен механизам, креирани се табелите `mentorship_future` и `message_future`. Сите податоци чиј датум не припаѓа во експлицитно дефинираните години ќе бидат рутирани тука, со што се спречува системско паѓање при внес на непланирани датуми. 11 11 12 12 == Оптимизација преку локални индекси … … 16 16 == Миграција и Доказ за перформанси 17 17 18 За да се докаже функционалноста на архитектурата, извршена е симулација на миграција на податоци преку префрлање на 100,000 записи од оригиналната во партиционираната структура. При самиот INSERT, PostgreSQL интелигентно ги рутираше податоците во соодветните физички табели. Оваа рутирана дистрибуција е верификувана преку повик кон системската колона tableoid::regclass, каде јасно се гледа физичката локација на секој поединечен запис.18 За да се докаже функционалноста на архитектурата, извршена е симулација на миграција на податоци преку префрлање на 100,000 записи од оригиналната во партиционираната структура. При самиот `INSERT`, PostgreSQL интелигентно ги рутираше податоците во соодветните физички табели. Оваа рутирана дистрибуција е верификувана преку повик кон системската колона `tableoid::regclass`, каде јасно се гледа физичката локација на секој поединечен запис. 19 19 20 Крајната придобивка од оваа архитектура е Partition Pruning. При извршување на аналитички пребарувања (на пр. барање пораки исклучиво за 2024 година), EXPLAIN ANALYZE планот потврдува дека Query Optimizer-от ја скенира единствено табелата message_2024, додека останатите физички партиции целосно ги игнорира.20 Крајната придобивка од оваа архитектура е Partition Pruning. При извршување на аналитички пребарувања (на пр. барање пораки исклучиво за 2024 година), `EXPLAIN ANALYZE` планот потврдува дека *Query Optimizer*-от ја скенира единствено табелата `message_2024`, додека останатите физички партиции целосно ги игнорира. 21 21 22 == SQL Скрипти 23 24 === 1. Партиционирање на табелата Mentorship 22 25 23 26 {{{ 27 #!sql 24 28 CREATE TABLE Mentorship_Partitioned 25 29 ( 26 ID BIGSERIAL,27 StudentID BIGINT NOT NULL,28 MentorID BIGINT NOT NULL,29 TopicSuggestionID BIGINT NOT NULL,30 MentorshipTypeID BIGINT NOT NULL,31 CreatedAt DATE NOT NULL,30 ID BIGSERIAL, 31 StudentID BIGINT NOT NULL, 32 MentorID BIGINT NOT NULL, 33 TopicSuggestionID BIGINT NOT NULL, 34 MentorshipTypeID BIGINT NOT NULL, 35 CreatedAt DATE NOT NULL, 32 36 33 37 PRIMARY KEY(ID, CreatedAt) … … 35 39 PARTITION BY RANGE (CreatedAt); 36 40 41 -- Креирање на партиции по години 42 CREATE TABLE mentorship_2024 PARTITION OF Mentorship_Partitioned 43 FOR VALUES FROM ('2024-01-01') TO ('2025-01-01'); 37 44 38 CREATE TABLE mentorship_2024 39 PARTITION OF Mentorship_Partitioned 40 FOR VALUES FROM ('2024-01-01') 41 TO ('2025-01-01'); 45 CREATE TABLE mentorship_2025 PARTITION OF Mentorship_Partitioned 46 FOR VALUES FROM ('2025-01-01') TO ('2026-01-01'); 42 47 48 CREATE TABLE mentorship_2026 PARTITION OF Mentorship_Partitioned 49 FOR VALUES FROM ('2026-01-01') TO ('2027-01-01'); 43 50 44 CREATE TABLE mentorship_2025 45 PARTITION OF Mentorship_Partitioned 46 FOR VALUES FROM ('2025-01-01') 47 TO ('2026-01-01'); 51 -- Default партиција 52 CREATE TABLE mentorship_future PARTITION OF Mentorship_Partitioned DEFAULT; 48 53 54 -- Локални индекси 55 CREATE INDEX idx_m2024_student ON mentorship_2024(StudentID); 56 CREATE INDEX idx_m2025_student ON mentorship_2025(StudentID); 57 CREATE INDEX idx_m2026_student ON mentorship_2026(StudentID); 49 58 50 CREATE TABLE mentorship_2026 51 PARTITION OF Mentorship_Partitioned 52 FOR VALUES FROM ('2026-01-01') 53 TO ('2027-01-01'); 59 -- Тест на внесување и верификација 60 INSERT INTO Mentorship_Partitioned (StudentID, MentorID, TopicSuggestionID, MentorshipTypeID, CreatedAt) 61 VALUES (1, 2, 3, 1, '2025-06-15'); 54 62 63 SELECT tableoid::regclass, * FROM Mentorship_Partitioned; 64 }}} 55 65 66 === 2. Партиционирање на табелата Message 56 67 57 CREATE TABLE mentorship_future 58 PARTITION OF Mentorship_Partitioned 59 DEFAULT; 60 61 62 63 CREATE INDEX idx_m2024_student 64 ON mentorship_2024(StudentID); 65 66 CREATE INDEX idx_m2025_student 67 ON mentorship_2025(StudentID); 68 69 CREATE INDEX idx_m2026_student 70 ON mentorship_2026(StudentID); 71 72 73 INSERT INTO Mentorship_Partitioned 68 {{{ 69 #!sql 70 CREATE TABLE Message_Partitioned 74 71 ( 75 StudentID, 76 MentorID, 77 TopicSuggestionID, 78 MentorshipTypeID, 79 CreatedAt 80 ) 81 VALUES 82 ( 83 1, 84 2, 85 3, 86 1, 87 '2025-06-15' 88 ); 89 90 91 SELECT tableoid::regclass, * 92 FROM Mentorship_Partitioned; CREATE TABLE Message_Partitioned 93 ( 94 ID BIGSERIAL, 95 Content TEXT, 96 isRead BOOLEAN, 72 ID BIGSERIAL, 73 Content TEXT, 74 isRead BOOLEAN, 97 75 Timestamp TIMESTAMP NOT NULL, 98 ChatID BIGINT NOT NULL,99 UserID BIGINT NOT NULL,76 ChatID BIGINT NOT NULL, 77 UserID BIGINT NOT NULL, 100 78 101 79 PRIMARY KEY (ID, Timestamp) … … 103 81 PARTITION BY RANGE (Timestamp); 104 82 83 -- Креирање на партиции по години 84 CREATE TABLE message_2024 PARTITION OF Message_Partitioned 85 FOR VALUES FROM ('2024-01-01') TO ('2025-01-01'); 105 86 106 CREATE TABLE message_2024 107 PARTITION OF Message_Partitioned 108 FOR VALUES FROM ('2024-01-01') 109 TO ('2025-01-01'); 87 CREATE TABLE message_2025 PARTITION OF Message_Partitioned 88 FOR VALUES FROM ('2025-01-01') TO ('2026-01-01'); 110 89 111 CREATE TABLE message_2025 112 PARTITION OF Message_Partitioned 113 FOR VALUES FROM ('2025-01-01') 114 TO ('2026-01-01'); 90 CREATE TABLE message_2026 PARTITION OF Message_Partitioned 91 FOR VALUES FROM ('2026-01-01') TO ('2027-01-01'); 115 92 116 CREATE TABLE message_2026 117 PARTITION OF Message_Partitioned 118 FOR VALUES FROM ('2026-01-01') 119 TO ('2027-01-01'); 93 -- Default партиција 94 CREATE TABLE message_future PARTITION OF Message_Partitioned DEFAULT; 120 95 121 CREATE TABLE message_future 122 PARTITION OF Message_Partitioned 123 DEFAULT; 96 -- Локални индекси за ChatID 97 CREATE INDEX idx_msg2024_chat ON message_2024(ChatID); 98 CREATE INDEX idx_msg2025_chat ON message_2025(ChatID); 99 CREATE INDEX idx_msg2026_chat ON message_2026(ChatID); 124 100 101 -- Локални индекси за UserID 102 CREATE INDEX idx_msg2024_user ON message_2024(UserID); 103 CREATE INDEX idx_msg2025_user ON message_2025(UserID); 104 CREATE INDEX idx_msg2026_user ON message_2026(UserID); 125 105 126 CREATE INDEX idx_msg2024_chat 127 ON message_2024(ChatID); 106 -- Тест на поединечен внес 107 INSERT INTO Message_Partitioned (Content, isRead, Timestamp, ChatID, UserID) 108 VALUES ('Testing partitioning', false, '2025-04-10 12:00:00', 1, 1); 128 109 129 CREATE INDEX idx_msg2025_chat 130 ON message_2025(ChatID); 110 SELECT tableoid::regclass, * FROM Message_Partitioned; 111 }}} 131 112 132 CREATE INDEX idx_msg2026_chat 133 ON message_2026(ChatID); 113 === 3. Масовна миграција и Анализа на перформанси 134 114 135 CREATE INDEX idx_msg2024_user 136 ON message_2024(UserID); 137 138 CREATE INDEX idx_msg2025_user 139 ON message_2025(UserID); 140 141 CREATE INDEX idx_msg2026_user 142 ON message_2026(UserID); 143 144 145 146 147 INSERT INTO Message_Partitioned 148 ( 149 Content, 150 isRead, 151 Timestamp, 152 ChatID, 153 UserID 154 ) 155 VALUES 156 ( 157 'Testing partitioning', 158 false, 159 '2025-04-10 12:00:00', 160 1, 161 1 162 ); 163 164 165 SELECT tableoid::regclass, * 166 FROM Message_Partitioned; 167 168 169 170 115 {{{ 116 #!sql 117 -- Симулација на масовна миграција (100,000 записи) 171 118 INSERT INTO Message_Partitioned (ID, Content, isRead, Timestamp, ChatID, UserID) 172 119 SELECT ID, Content, isRead, Timestamp, ChatID, UserID … … 174 121 LIMIT 100000; 175 122 123 -- Освежување на статистиките на планот 176 124 ANALYZE Message_Partitioned; 177 125 178 126 -- Верификација на Partition Pruning 179 127 EXPLAIN ANALYZE 180 128 SELECT * 181 129 FROM Message_Partitioned 182 WHERE Timestamp BETWEEN 183 '2024-01-01' 184 AND 185 '2024-12-31'; 130 WHERE Timestamp BETWEEN '2024-01-01' AND '2024-12-31'; 186 131 187 132 -- Проверка на директни записи во специфична партиција 188 133 SELECT ID, Timestamp, Content 189 134 FROM message_2024
