Changes between Initial Version and Version 1 of AdvancedTopics


Ignore:
Timestamp:
06/16/26 19:09:17 (4 days ago)
Author:
231067
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedTopics

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