Changes between Version 62 and Version 63 of AdvancedTopics


Ignore:
Timestamp:
05/22/26 15:18:13 (4 days ago)
Author:
231189
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedTopics

    v62 v63  
    203203[[Image("vozovi po particija.png",500px)]]
    204204
    205 
    206 Финална проверка на капацитетот:$$650 \text{ возови} \times 30 \text{ билети} = \mathbf{19,500 \text{ билети}} \approx 20,000 \quad \checkmark$$
     205Зошто по точно 650?
     206
     207Бидејќи train_trip_id се доделуваат последователно (1, 2, 3...), во еден месец ID-ата се движат во строго дефиниран континуиран опсег. Ова овозможува директно следење на партициите на Train Trip, но со прецизно сечење на 5 помали пакувања по месец.
     208Со овој пристап секоја партиција на Ticket директно кореспондира со точно дефиниран подопсег од месечна партиција на Train Trip, со што се гарантира:
     209
     210    - Еден тикет се наоѓа во точно една партиција.
     211
     212    - Секоја партиција содржи стабилни ~19,500 записи.
     213
     214    - PostgreSQL може максимално да примени Partition Pruning при JOIN операции меѓу билетите и возовите.
     215
     216    - Партициите на Ticket и Train Trip се логички и структурно усогласени.
     217
     218Финална проверка на капацитетот:
     219[[Image("finalna presmetka.png",500px)]]
    207220
    208221=== Kод со објаснување
     
    223236-Се креира нова главна табела Ticket која служи како parent табела
    224237
    225 -Податоците се дефинирани да се делат со користење на PARTITION BY HASH (ticket_id)
    226 
    227 -Типот на податок за цената е оптимизиран во NUMERIC(5,2) за соодветна поддршка на вредностите
     238-Податоците се дефинирани да се делат со PARTITION BY RANGE ("Train Triptrip_id").
     239
     240-Примарниот клуч е составен (composite): (ticket_id, "Train Triptrip_id") – задолжително бидејќи партицискиот клуч мора да биде дел од PRIMARY KEY во PostgreSQL.
     241
     242-Додадена е колоната payment_transaction_date за да се овозможи composite Foreign Key кон Payment, со цел усогласување на партициите.
     243
     244[[Image(constraint.png,500px)]]
     245-Дополнителни constraints кои треба да се запазат при внес на податоците во новата табела.
    228246
    229247- **STEP 3: Автоматско креирање партиции (динамички преку DO блок)**
    230248
    231 [[Image(Particija.png, 500px)]]
    232 
    233 -Се користи динамички DO блок со FOR јамка за автоматизација
    234 
    235 -Автоматски се креираат 16 партиции (од ticket_p0 до ticket_p15)
    236 
    237 -Секоја партиција се заснова на MODULUS 16 и соодветниот REMAINDER
    238 
    239 -Спречува мануелно пишување на 16 посебни SQL команди за креирање табели
     249[[Image(particii.png, 500px)]]
     250
     251-Се користи динамички DO блок со WHILE јамка за автоматизација.Автоматски се креираат ~616 партиции (**400,000 / 650 ~ 616**) именувани ticket_p_range_0 до ticket_p_range_615.
     252
     253-Секоја партиција покрива опсег од 650 trip_id вредности, односно приближно ~19,500 тикети по партиција.
     254
     255-LEAST(current_id + step_size, max_id + 1) спречува излегување надвор од дефинираниот опсег при последната партиција.
     256
     257-Спречува мануелно пишување на стотици посебни SQL команди за креирање табели.
    240258
    241259- **STEP 4: Внесување податоци од стара табела (Миграција)**
     
    243261[[Image("Insert vo particiite.png", 500px)]]
    244262
    245 -Ги префрла сите зачувани записи од old_ticket во новата структура
    246 
    247 -PostgreSQL автоматски во позадина ги распределува редовите низ 16-те партиции врз основа на хаш функцијата
     263-Ги префрла сите зачувани записи од old_ticket во новата партиционирана структура.
     264
     265-INNER JOIN Payment е неопходен за да се добие transaction_date, бидејќи таа колона не постоела во старата табела.
     266
     267-WHERE "Train Triptrip_id" IS NOT NULL ги исклучува некомплетните записи кои не можат да се распределат во партиција.
     268
     269-PostgreSQL автоматски во позадина ги распределува редовите низ партициите врз основа на вредноста на Train Triptrip_id.
    248270
    249271- **STEP 5: Проверка на сите партиции**
     
    259281=== Заклучок
    260282
    261 Со имплементација на HASH партиционирање на табелата Ticket, успеавме масовниот волумен од милиони податоци да го поделиме на 16 рамномерни физички табели. Пребарувањето на билетите сега се извршува моментално бидејќи PostgreSQL точно знае во која под-табела се наоѓа бараниот ticket_id. Ова резултира со драстично намалување на оптоварувањето, побрз одзив на системот и долгорочна скалабилност на железничката платформа.
     283Со имплементација на RANGE партиционирање на табелата Ticket по Train Triptrip_id, успеавме масовниот волумен од 12 милиони записи да го поделиме на ~616 рамномерни физички табели од приближно ~19,500 записи секоја. Пребарувањето на билетите сега се извршува моментално бидејќи PostgreSQL точно знае во која под-табела се наоѓа бараниот тикет врз основа на патувањето.
     284
     285Дополнително, усогласувањето со партициите на Payment преку composite Foreign Key гарантира дека еден тикет никогаш не се појавува во две различни партиции. Ова резултира со драстично намалување на оптоварувањето, побрз одзив на системот и долгорочна скалабилност на железничката платформа.