| 196 | | |
| 197 | | |
| 198 | | |
| 199 | | |
| 200 | | |
| | 196 | === Партицинориање на customer табелата |
| | 197 | |
| | 198 | {{{ ALTER TABLE customer RENAME TO customer_old; }}} |
| | 199 | |
| | 200 | {{{ |
| | 201 | CREATE TABLE customer ( |
| | 202 | customer_id BIGINT GENERATED ALWAYS AS IDENTITY, |
| | 203 | store_id INT NOT NULL, |
| | 204 | first_name TEXT NOT NULL, |
| | 205 | last_name TEXT NOT NULL, |
| | 206 | email TEXT, |
| | 207 | address_id BIGINT NOT NULL, |
| | 208 | PRIMARY KEY (customer_id, store_id) |
| | 209 | ) |
| | 210 | PARTITION BY LIST (store_id); |
| | 211 | }}} |
| | 212 | |
| | 213 | Сега ќе направиме партиционирање со List partitioning. |
| | 214 | {{{ |
| | 215 | CREATE TABLE customer_store_1 PARTITION OF customer FOR VALUES IN (1); |
| | 216 | CREATE TABLE customer_store_2 PARTITION OF customer FOR VALUES IN (2); |
| | 217 | CREATE TABLE customer_store_3 PARTITION OF customer FOR VALUES IN (3); |
| | 218 | CREATE TABLE customer_store_4 PARTITION OF customer FOR VALUES IN (4); |
| | 219 | CREATE TABLE customer_store_5 PARTITION OF customer FOR VALUES IN (5); |
| | 220 | }}} |
| | 221 | |
| | 222 | {{{ |
| | 223 | INSERT INTO customer (store_id, first_name, last_name, email, address_id) |
| | 224 | SELECT store_id, first_name, last_name, email, address_id |
| | 225 | FROM customer_old; |
| | 226 | }}} |
| | 227 | |
| | 228 | {{{ |
| | 229 | ALTER TABLE customer ADD FOREIGN KEY (address_id) REFERENCES address(address_id); |
| | 230 | ALTER TABLE customer ADD FOREIGN KEY (store_id) REFERENCES store(store_id); |
| | 231 | }}} |
| | 232 | |
| | 233 | Извршување на прашалник на старата табела без партиции. |
| | 234 | |
| | 235 | {{{ |
| | 236 | EXPLAIN ANALYSE |
| | 237 | SELECT * |
| | 238 | FROM customer_old |
| | 239 | WHERE store_id = 2; |
| | 240 | }}} |
| | 241 | |
| | 242 | [[Image(customer_query.png)]] |
| | 243 | |
| | 244 | PostgreSQL мора направи sequential scan и да елиминира 800 000 редови кои не припаѓаат на store_id = 2. |
| | 245 | |
| | 246 | Извршување на прашалник на новата табела со партиции |
| | 247 | |
| | 248 | {{{ |
| | 249 | EXPLAIN ANALYSE |
| | 250 | SELECT * |
| | 251 | FROM customer |
| | 252 | WHERE store_id = 2; |
| | 253 | }}} |
| | 254 | |
| | 255 | [[Image(customer_query_partition.png)]] |
| | 256 | |
| | 257 | Со помош на механизмот pruning PostgreSQL ја скенира само '''customer_store_2''' партицијата каде што store_id=2 и поради тоа се скенираат само 200 000 редови наместо 1 000 000 редови. |
| | 258 | |
| | 259 | |
| | 260 | |
| | 261 | |
| | 262 | |
| | 263 | |
| | 264 | |
| | 265 | |