Changes between Version 3 and Version 4 of AdvancedTopics


Ignore:
Timestamp:
07/02/26 02:29:25 (4 days ago)
Author:
231169
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedTopics

    v3 v4  
    1 == Партиционирање ==
     1= Партиционирање во !BlinkBuy =
    22[[html(<a href="https://develop.finki.ukim.mk/projects/BlinkBuy/attachment/wiki/AdvancedTopics/partitioning.sql">partitioning.sql</a>)]]
    33
    4 == Документација ==
    5 [[html(<a href="https://develop.finki.ukim.mk/projects/BlinkBuy/attachment/wiki/AdvancedTopics/%D0%9F%D0%B0%D1%80%D1%82%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%B0%D1%9A%D0%B5.pdf">partitioning.pdf</a>)]]
     4[[html(<a href="https://develop.finki.ukim.mk/projects/BlinkBuy/attachment/wiki/AdvancedTopics/%D0%9F%D0%B0%D1%80%D1%82%D0%B8%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%B0%D1%9A%D0%B5.pdf">Партиционирање.pdf</a>)]]
     5
     6== Вовед ==
     7
     8Партиционирањето е техника во PostgreSQL која овозможува една голема логичка табела да се подели на повеќе физички табели (партиции). На овој начин базата не мора да ги пребарува сите записи при секое барање, туку само релевантните партиции преку механизмот '''partition pruning'''.
     9
     10Во BlinkBuy партиционирањето е применето на најголемите табели со цел да се подобрат:
     11
     12* перформансите при пребарување;
     13* брзината на внесување и ажурирање на податоци;
     14* одржувањето и архивирањето на историски записи.
     15
     16Користени се два типа на партиционирање:
     17
     18* '''LIST Partitioning''' – за табели со ограничен број познати категории.
     19* '''RANGE Partitioning''' – за временски податоци кои континуирано растат.
     20
     21
     22
     23== PRODUCT_ATTRIBUTE_VALUES (LIST Partitioning) ==
     24
     25=== Причина ===
     26
     27`PRODUCT_ATTRIBUTE_VALUES` е најголемата табела во системот со околу '''15 милиони записи'''. Корисниците најчесто пребаруваат производи според нивните спецификации, како што се:
     28
     29* RAM
     30* Процесор
     31* Боја
     32
     33Без партиционирање секое пребарување би скенирало огромен број записи.
     34
     35=== Решение ===
     36
     37Табелата е партиционирана со '''LIST Partitioning''' според колоната `attribute_id`.
     38
     39Најчесто користените атрибути се сместени во посебни партиции:
     40
     41* `pav_ram`
     42* `pav_processor`
     43* `pav_color` итн.
     44
     45=== Предности ===
     46
     47Кога корисникот пребарува, на пример, производи со '''16 GB RAM''', PostgreSQL ја чита само партицијата `pav_ram`, додека останатите партиции целосно се прескокнуваат.
     48
     49Ова значително го намалува бројот на прочитани записи и времето на извршување на SQL барањата.
     50
     51=== SQL ===
     52
     53{{{
     54CREATE TABLE PRODUCT_ATTRIBUTE_VALUES_P (
     55  variant_id   int8 NOT NULL,
     56  attribute_id int8 NOT NULL,
     57  attr_value   varchar(255) NOT NULL,
     58  -- pk contains attribute_id
     59  PRIMARY KEY (variant_id, attribute_id)
     60) PARTITION BY LIST (attribute_id);
     61}}}
     62
     63
     64== PRODUCT_PRICE_HISTORY (RANGE Partitioning) ==
     65
     66=== Причина ===
     67
     68`PRODUCT_PRICE_HISTORY` содржи околу '''2.25 милиони записи''' и ги чува сите промени на цените.
     69
     70Бидејќи се работи за временски (time-series) податоци, природен избор е RANGE партиционирање.
     71
     72=== Решение ===
     73
     74Партиционирањето е извршено по месеци според колоната `change_date`.
     75
     76=== Предности ===
     77
     78* Анализите за конкретен месец или квартал пребаруваат само една или неколку партиции.
     79* Старите податоци можат лесно да се архивираат или избришат со откачување (detach) на цела партиција, без големи `DELETE` операции.
     80
     81=== SQL ===
     82
     83{{{
     84CREATE TABLE PRODUCT_PRICE_HISTORY_P (
     85  history_id  int8 NOT NULL,
     86  variant_id  int8 NOT NULL,
     87  old_price   numeric(12, 2) NOT NULL,
     88  new_price   numeric(12, 2) NOT NULL,
     89  change_date timestamp with time zone NOT NULL,
     90  -- pk includes date
     91  PRIMARY KEY (history_id, change_date)
     92) PARTITION BY RANGE (change_date);
     93}}}
     94
     95== ORDER_STATUS_HISTORY (RANGE Partitioning) ==
     96
     97=== Причина ===
     98
     99`ORDER_STATUS_HISTORY` содржи околу '''2.06 милиони записи''' и го следи целиот животен циклус на една нарачка.
     100
     101=== Решение ===
     102
     103Табелата е партиционирана по месеци користејќи ја колоната `change_date`.
     104
     105=== Предности ===
     106
     107* Историјата на една нарачка најчесто се наоѓа во една месечна партиција.
     108* Новите статуси се запишуваат само во тековната партиција, што овозможува побрзо ажурирање.
     109* Индексите остануваат мали и поефикасни за читање и запишување.
     110
     111=== Забелешка ===
     112
     113Иако табелата ги содржи сите статуси, вклучувајќи го и иницијалниот статус `CART`, при анализи на логистичките перформанси намерно се исклучува.
     114
     115Причината е што статусот `CART` претставува пред-продажна активност која може да трае подолг временски период. Вклучувањето на овие записи би довело до неточни пресметки за времето потребно за обработка и испорака на нарачките.
     116
     117=== SQL ===
     118
     119{{{
     120CREATE TABLE ORDER_STATUS_HISTORY_P (
     121  history_id  int8 NOT NULL,
     122  order_id    int8 NOT NULL,
     123  old_status  varchar(255) NOT NULL,
     124  new_status  varchar(255) NOT NULL,
     125  change_date timestamp with time zone NOT NULL,
     126  -- PK мора да го содржи датумот поради партиционирањето
     127  PRIMARY KEY (history_id, change_date)
     128) PARTITION BY RANGE (change_date);
     129}}}
     130
     131
     132== Заклучок ==
     133
     134Со примената на партиционирањето во BlinkBuy се постигнуваат значителни подобрувања во:
     135
     136* брзината на пребарување;
     137* ефикасноста при запишување на нови записи;
     138* одржувањето на големи количини историски податоци;
     139* можноста за лесно архивирање и бришење на стари информации.
     140
     141LIST партиционирањето е применето за категоријални податоци, додека RANGE партиционирањето е искористено за сите временски зависни табели, што претставува најсоодветно решение според природата на податоците.