| 104 | | По партиционирањето, PostgreSQL веќе не ја скенира целата табела, туку со помош на '''partition pruning''' кој што во поновите верзии на PostgreSQL е пуштен по default PostgreSQL не ги скенира партициите во кој што WHERE условот не е исполнет. Ја скенира само конкретната партиција '''rental_2022''' и со тоа наместо да обработуваат 10 милиони редови, се обработуваат само податоците во релевантната партиција, времето на извршување е скоро преполовено и со помош на филтер се елеминираат околу 5 илјади редови наместо 8 милиони. |
| | 109 | По партиционирањето, PostgreSQL веќе не ја скенира целата табела, туку со помош на '''partition pruning''' кој што во поновите верзии на PostgreSQL е пуштен по default PostgreSQL не ги скенира партициите во кој што WHERE условот не е исполнет. Ја скенира само конкретната партиција '''rental_2022''' и со тоа наместо да обработуваат 10 милиони редови, се обработуваат само податоците во релевантната партиција, времето на извршување е скоро преполовено и со помош на филтер се елиминираат околу 5 илјади редови наместо 8 милиони. |
| | 110 | |
| | 111 | === Партицинориање на payment табелата |
| | 112 | |
| | 113 | Постапката е иста како и кај rental табелата. |
| | 114 | |
| | 115 | {{{ ALTER TABLE payment RENAME TO payment_old; }}} |
| | 116 | |
| | 117 | {{{ |
| | 118 | CREATE TABLE payment ( |
| | 119 | payment_id BIGINT GENERATED ALWAYS AS IDENTITY, |
| | 120 | customer_id BIGINT NOT NULL, |
| | 121 | staff_id BIGINT NOT NULL, |
| | 122 | rental_id BIGINT NOT NULL, |
| | 123 | amount NUMERIC(5,2) NOT NULL, |
| | 124 | payment_date TIMESTAMP NOT NULL, |
| | 125 | PRIMARY KEY (payment_id, payment_date) |
| | 126 | ) |
| | 127 | PARTITION BY RANGE (payment_date); |
| | 128 | }}} |
| | 129 | |
| | 130 | Тука правиме партиционирање по месец па така ќе имаме 5 години x 12 месеци = 60 партиции. |
| | 131 | {{{ |
| | 132 | DO $$ |
| | 133 | DECLARE |
| | 134 | y int; |
| | 135 | m int; |
| | 136 | start_date date; |
| | 137 | end_date date; |
| | 138 | partition_name text; |
| | 139 | BEGIN |
| | 140 | FOR y IN 2020..2024 LOOP |
| | 141 | FOR m IN 1..12 LOOP |
| | 142 | start_date := make_date(y, m, 1); |
| | 143 | end_date := (make_date(y, m, 1) + interval '1 month')::date; |
| | 144 | |
| | 145 | partition_name := format('payment_%s_%s', y, lpad(m::text, 2, '0')); |
| | 146 | |
| | 147 | EXECUTE format( |
| | 148 | 'CREATE TABLE %I PARTITION OF payment |
| | 149 | FOR VALUES FROM (%L) TO (%L);', |
| | 150 | partition_name, |
| | 151 | start_date, |
| | 152 | end_date |
| | 153 | ); |
| | 154 | END LOOP; |
| | 155 | END LOOP; |
| | 156 | END $$; |
| | 157 | }}} |
| | 158 | |
| | 159 | {{{ |
| | 160 | INSERT INTO payment (customer_id, staff_id, rental_id, amount, payment_date) |
| | 161 | SELECT customer_id, staff_id, rental_id, amount, payment_date |
| | 162 | FROM payment_old; |
| | 163 | }}} |
| | 164 | |
| | 165 | {{{ |
| | 166 | ALTER TABLE payment ADD CONSTRAINT fk_payment_customer FOREIGN KEY (customer_id) REFERENCES customer(customer_id) ON UPDATE CASCADE ON DELETE RESTRICT; |
| | 167 | ALTER TABLE payment ADD CONSTRAINT fk_payment_staff FOREIGN KEY (staff_id) REFERENCES staff(staff_id) ON UPDATE CASCADE ON DELETE RESTRICT; |
| | 168 | }}} |