Changes between Initial Version and Version 1 of Phase1_Partitioning


Ignore:
Timestamp:
12/10/25 00:04:55 (3 weeks ago)
Author:
226052
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Phase1_Partitioning

    v1 v1  
     1= Партиционирање на податоци
     2Партиционирање на податоците е техника каде што една табела се дели на повеќе помали физички делови наречени партиции. Секоја партиција е посебна табела што складира дел од вкупните податоци.
     3
     4Главната цел на партиционирање на податоците е:
     5* Подобрување на перформансите при извршување на прашалници особено кога најчесто пристапуваните редови се наоѓаат во една или повеќе партиции. Исто така ги заменува по високите нивоа на индексите така што повеќе користените индекси се во меморија.
     6* Подобри перформанси за прашалници кои пристапуваат голем дел од една партиција со тоа што ќе се користи секвенцијално читање наместо индекси кој што ќе прават случајни читања низ целата табела.
     7* Голема ефикасност при масовно бришење и вчитување на податоци, со тоа што наместо да работиме ред по ред, можеме едноставно да додадеме или отстраниме цела партиција (користејќи ** ATTACH PARTITION ** или ** DROP TABLE/DETACH PARTITION **).
     8* Поефикасно искористување на дисковите за складирање на податоците со тоа што за податоците што ретко се пристапуваат може да се префрлат на поевтини дискови.
     9
     10
     11Во PostgreSQL постојат следниве вградени типови на партиционирање:
     12* ''' Партиционирање по опсег(Range Partitioning)''' податоците се делат според опсег на вредности. Најчесто се користи за датуми, цени, возрасти и сл.
     13* ''' Партиционирање по листа(List Partitioning) ''' податоците се делат по однапред дефинирани вредности на одредена колона.
     14* ''' Партиционирање по Хeш (Hash Partitioning) ''' податоците се распределуваат рамномерно користејќи хеш функција. За секоја партиција се дефинира модулус/делител и остаток.
     15
     16
     17Партиционирањето е најкорисно за многу големи табели. Дали некоја табела би имала придобивка од партиционирање зависи од апликацијата. Ако табелата е релативно мала и ако нема јасен критериум за поделба тогаш партиционирањето може да донесе повеќе штета отколку корист. Во такви случаи се воведува дополнителна комплексност без значително подобрување на перформансите, а понекогаш и со нивно влошување.
     18
     19== Примена на партиционирање во FilmRentalDB
     20
     21Во FilmRentalDB партиционирањето е најкорисно за табелите '''rental''' и '''payment''' поради тоа што тие може да содржат голем број на трансакции кои континуирано расте.
     22
     23=== Партицинориање на rental табелата
     24
     25Оваа табела ќе ја партиционираме по колоната '''rental_date''' со помош на Range партиционирање. Податоците ќе ги делиме по година со што ќе се овозможи побрзо пристапување до податоци во определен временски период.
     26
     27За да ги направиме партициите прво ќе треба да ја преименуваме веќе постоечката '''rental''' табела се со цел да направиме нова партиционирана '''rental''' табела.
     28
     29{{{ ALTER TABLE rental RENAME TO rental_old; }}}
     30
     31Потоа ја креираме новатa '''rental''' табела
     32
     33{{{
     34CREATE TABLE rental (
     35    rental_id   BIGINT GENERATED ALWAYS AS IDENTITY,
     36    rental_date TIMESTAMP NOT NULL,
     37    inventory_id INT NOT NULL,
     38    customer_id  INT NOT NULL,
     39    staff_id     INT NOT NULL,
     40    return_date  TIMESTAMP,
     41    last_update  TIMESTAMP DEFAULT now(),
     42    PRIMARY KEY (rental_id, rental_date)
     43)
     44PARTITION BY RANGE (rental_date);
     45}}}
     46
     47Тука '''rental_date''' мора да биде дел од примарниот клуч поради тоа што PostgreSQL бара колоната по која се партиционира да биде вклучена во сите UNIQUE ограничувања и примарни клучеви.
     48
     49Во мојата база има 10 милиони записи движејќи се од 2020 до 2024 година. Па поради тоа правиме 5 партиции.
     50
     51{{{
     52CREATE TABLE rental_2020 PARTITION OF rental
     53FOR VALUES FROM ('2020-01-01') TO ('2021-01-01');
     54
     55CREATE TABLE rental_2021 PARTITION OF rental
     56FOR VALUES FROM ('2021-01-01') TO ('2022-01-01');
     57
     58CREATE TABLE rental_2022 PARTITION OF rental
     59FOR VALUES FROM ('2022-01-01') TO ('2023-01-01');
     60
     61CREATE TABLE rental_2023 PARTITION OF rental
     62FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
     63
     64CREATE TABLE rental_2024 PARTITION OF rental
     65FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
     66}}}
     67
     68Потоа ги внесуваме податоците од старата табела
     69
     70{{{
     71INSERT INTO rental (rental_date, inventory_id, customer_id, staff_id, return_date, last_update)
     72SELECT rental_date, inventory_id, customer_id, staff_id, return_date, last_update
     73FROM rental_old;
     74}}}
     75
     76
     77