| 1 | -- partitioning
|
|---|
| 2 |
|
|---|
| 3 | --======
|
|---|
| 4 | -- product_attribute_values
|
|---|
| 5 | --======
|
|---|
| 6 |
|
|---|
| 7 | SET search_path TO myschema;
|
|---|
| 8 |
|
|---|
| 9 | -- 1. create master table
|
|---|
| 10 | CREATE TABLE PRODUCT_ATTRIBUTE_VALUES_P (
|
|---|
| 11 | variant_id int8 NOT NULL,
|
|---|
| 12 | attribute_id int8 NOT NULL,
|
|---|
| 13 | attr_value varchar(255) NOT NULL,
|
|---|
| 14 | -- pk contains attribute_id
|
|---|
| 15 | PRIMARY KEY (variant_id, attribute_id)
|
|---|
| 16 | ) PARTITION BY LIST (attribute_id);
|
|---|
| 17 |
|
|---|
| 18 | -- 2. create partitions for main attributes
|
|---|
| 19 | CREATE TABLE pav_processor PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (1);
|
|---|
| 20 | CREATE TABLE pav_ram PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (2);
|
|---|
| 21 | CREATE TABLE pav_storage PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (3);
|
|---|
| 22 | CREATE TABLE pav_screen_size PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (4);
|
|---|
| 23 | CREATE TABLE pav_display_type PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (5);
|
|---|
| 24 | CREATE TABLE pav_battery PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (6);
|
|---|
| 25 | CREATE TABLE pav_gpu PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (7);
|
|---|
| 26 | CREATE TABLE pav_color PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (8);
|
|---|
| 27 | CREATE TABLE pav_efficiency PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (9);
|
|---|
| 28 | CREATE TABLE pav_power PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P FOR VALUES IN (10);
|
|---|
| 29 |
|
|---|
| 30 | -- 3. default partition for other attr
|
|---|
| 31 | CREATE TABLE pav_default PARTITION OF PRODUCT_ATTRIBUTE_VALUES_P DEFAULT;
|
|---|
| 32 |
|
|---|
| 33 | -- insert the data
|
|---|
| 34 | ALTER TABLE PRODUCT_ATTRIBUTE_VALUES RENAME TO PRODUCT_ATTRIBUTE_VALUES_OLD;
|
|---|
| 35 |
|
|---|
| 36 | INSERT INTO PRODUCT_ATTRIBUTE_VALUES_P (variant_id, attribute_id, attr_value)
|
|---|
| 37 | SELECT variant_id, attribute_id, attr_value FROM PRODUCT_ATTRIBUTE_VALUES_OLD;
|
|---|
| 38 |
|
|---|
| 39 | ALTER TABLE PRODUCT_ATTRIBUTE_VALUES_P RENAME TO PRODUCT_ATTRIBUTE_VALUES;
|
|---|
| 40 |
|
|---|
| 41 | --======
|
|---|
| 42 | -- checks
|
|---|
| 43 | --======
|
|---|
| 44 |
|
|---|
| 45 | EXPLAIN ANALYZE SELECT * FROM product_attribute_values WHERE attribute_id = 2;
|
|---|
| 46 |
|
|---|
| 47 | SELECT
|
|---|
| 48 | p.relname AS partition_name,
|
|---|
| 49 | s.n_live_tup AS row_count
|
|---|
| 50 | FROM pg_stat_user_tables s
|
|---|
| 51 | JOIN pg_class p ON s.relid = p.oid
|
|---|
| 52 | WHERE p.relname LIKE 'pav_%'
|
|---|
| 53 | ORDER BY row_count DESC;
|
|---|
| 54 |
|
|---|
| 55 | SELECT
|
|---|
| 56 | nmsp_parent.nspname AS parent_schema,
|
|---|
| 57 | parent.relname AS parent_table,
|
|---|
| 58 | nmsp_child.nspname AS partition_schema,
|
|---|
| 59 | child.relname AS partition_name,
|
|---|
| 60 | pg_get_expr(child.relpartbound, child.oid) AS partition_expression
|
|---|
| 61 | FROM pg_inherits
|
|---|
| 62 | JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
|
|---|
| 63 | JOIN pg_class child ON pg_inherits.inhrelid = child.oid
|
|---|
| 64 | JOIN pg_namespace nmsp_parent ON parent.relnamespace = nmsp_parent.oid
|
|---|
| 65 | JOIN pg_namespace nmsp_child ON child.relnamespace = nmsp_child.oid
|
|---|
| 66 | WHERE parent.relname = 'product_attribute_values';
|
|---|
| 67 |
|
|---|
| 68 | -- rows in partitions
|
|---|
| 69 | SELECT 'pav_processor' as partition, count(*) FROM pav_processor
|
|---|
| 70 | UNION ALL SELECT 'pav_ram', count(*) FROM pav_ram
|
|---|
| 71 | UNION ALL SELECT 'pav_storage', count(*) FROM pav_storage
|
|---|
| 72 | UNION ALL SELECT 'pav_screen_size', count(*) FROM pav_screen_size
|
|---|
| 73 | UNION ALL SELECT 'pav_display_type', count(*) FROM pav_display_type
|
|---|
| 74 | UNION ALL SELECT 'pav_battery', count(*) FROM pav_battery
|
|---|
| 75 | UNION ALL SELECT 'pav_gpu', count(*) FROM pav_gpu
|
|---|
| 76 | UNION ALL SELECT 'pav_color', count(*) FROM pav_color
|
|---|
| 77 | UNION ALL SELECT 'pav_efficiency', count(*) FROM pav_efficiency
|
|---|
| 78 | UNION ALL SELECT 'pav_power', count(*) FROM pav_power
|
|---|
| 79 | UNION ALL SELECT 'pav_default (Others)', count(*) FROM pav_default;
|
|---|
| 80 |
|
|---|
| 81 |
|
|---|
| 82 | INSERT INTO product_attribute_values (variant_id, attribute_id, attr_value)
|
|---|
| 83 | VALUES (9999999999, 2, '128GB');
|
|---|
| 84 |
|
|---|
| 85 | SELECT * FROM pav_ram WHERE variant_id = 9999999999;
|
|---|
| 86 |
|
|---|
| 87 | -- does new attr_id go to default
|
|---|
| 88 | INSERT INTO product_attribute_values (variant_id, attribute_id, attr_value)
|
|---|
| 89 | VALUES (9999999999, 99, 'Special_Value');
|
|---|
| 90 |
|
|---|
| 91 | SELECT * FROM pav_default WHERE variant_id = 9999999999;
|
|---|
| 92 |
|
|---|
| 93 | INSERT INTO product_attribute_values (variant_id, attribute_id, attr_value)
|
|---|
| 94 | VALUES (77777777, 999, 'Custom_Value');
|
|---|
| 95 | SELECT * FROM pav_default WHERE variant_id = 77777777;
|
|---|
| 96 |
|
|---|
| 97 | --color test
|
|---|
| 98 | INSERT INTO product_attribute_values (variant_id, attribute_id, attr_value)
|
|---|
| 99 | VALUES (88888888, 8, 'Deep Purple');
|
|---|
| 100 |
|
|---|
| 101 | SELECT * FROM pav_color WHERE variant_id = 88888888;
|
|---|
| 102 | EXPLAIN ANALYZE
|
|---|
| 103 | SELECT * FROM product_attribute_values
|
|---|
| 104 | WHERE attribute_id = 7 AND attr_value = 'RTX 4080';
|
|---|
| 105 |
|
|---|
| 106 | EXPLAIN ANALYZE
|
|---|
| 107 | SELECT * FROM product_attribute_values
|
|---|
| 108 | WHERE attribute_id = 8 AND attr_value = 'Silver';
|
|---|
| 109 |
|
|---|
| 110 | EXPLAIN ANALYZE
|
|---|
| 111 | SELECT * FROM product_attribute_values
|
|---|
| 112 | WHERE attr_value = 'White';
|
|---|
| 113 |
|
|---|
| 114 | SELECT
|
|---|
| 115 | parent.relname AS master_table,
|
|---|
| 116 | child.relname AS partition_name,
|
|---|
| 117 | pg_get_expr(child.relpartbound, child.oid) AS partition_definition
|
|---|
| 118 | FROM pg_inherits
|
|---|
| 119 | JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
|
|---|
| 120 | JOIN pg_class child ON pg_inherits.inhrelid = child.oid
|
|---|
| 121 | WHERE parent.relname = 'product_attribute_values'
|
|---|
| 122 | ORDER BY child.relname;
|
|---|
| 123 |
|
|---|
| 124 | --======
|
|---|
| 125 | -- product_price_history
|
|---|
| 126 | --======
|
|---|
| 127 |
|
|---|
| 128 | -- new partitioned table
|
|---|
| 129 | CREATE TABLE PRODUCT_PRICE_HISTORY_P (
|
|---|
| 130 | history_id int8 NOT NULL,
|
|---|
| 131 | variant_id int8 NOT NULL,
|
|---|
| 132 | old_price numeric(12, 2) NOT NULL,
|
|---|
| 133 | new_price numeric(12, 2) NOT NULL,
|
|---|
| 134 | change_date timestamp with time zone NOT NULL,
|
|---|
| 135 | -- pk includes date
|
|---|
| 136 | PRIMARY KEY (history_id, change_date)
|
|---|
| 137 | ) PARTITION BY RANGE (change_date);
|
|---|
| 138 |
|
|---|
| 139 |
|
|---|
| 140 | SELECT
|
|---|
| 141 | date_trunc('month', change_date) AS month_start,
|
|---|
| 142 | count(*) AS num_records
|
|---|
| 143 | FROM myschema.product_price_history
|
|---|
| 144 | GROUP BY month_start
|
|---|
| 145 | ORDER BY month_start;
|
|---|
| 146 |
|
|---|
| 147 | -- monthly partitions
|
|---|
| 148 | CREATE TABLE pph_2025_05 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2025-05-01') TO ('2025-06-01');
|
|---|
| 149 | CREATE TABLE pph_2025_06 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2025-06-01') TO ('2025-07-01');
|
|---|
| 150 |
|
|---|
| 151 |
|
|---|
| 152 | CREATE TABLE pph_2025_07 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2025-07-01') TO ('2025-08-01');
|
|---|
| 153 | CREATE TABLE pph_2025_08 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2025-08-01') TO ('2025-09-01');
|
|---|
| 154 | CREATE TABLE pph_2025_09 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2025-09-01') TO ('2025-10-01');
|
|---|
| 155 | CREATE TABLE pph_2025_10 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2025-10-01') TO ('2025-11-01');
|
|---|
| 156 | CREATE TABLE pph_2025_11 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2025-11-01') TO ('2025-12-01');
|
|---|
| 157 | CREATE TABLE pph_2025_12 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2025-12-01') TO ('2026-01-01');
|
|---|
| 158 |
|
|---|
| 159 |
|
|---|
| 160 | CREATE TABLE pph_2026_01 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
|
|---|
| 161 | CREATE TABLE pph_2026_02 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');
|
|---|
| 162 | CREATE TABLE pph_2026_03 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2026-03-01') TO ('2026-04-01');
|
|---|
| 163 | CREATE TABLE pph_2026_04 PARTITION OF PRODUCT_PRICE_HISTORY_P FOR VALUES FROM ('2026-04-01') TO ('2026-05-01');
|
|---|
| 164 |
|
|---|
| 165 | CREATE TABLE pph_default PARTITION OF PRODUCT_PRICE_HISTORY_P DEFAULT;
|
|---|
| 166 |
|
|---|
| 167 | INSERT INTO PRODUCT_PRICE_HISTORY_P
|
|---|
| 168 | SELECT * FROM product_price_history;
|
|---|
| 169 |
|
|---|
| 170 | EXPLAIN ANALYZE
|
|---|
| 171 | SELECT * FROM PRODUCT_PRICE_HISTORY_P
|
|---|
| 172 | WHERE change_date BETWEEN '2025-11-01' AND '2025-11-30';
|
|---|
| 173 |
|
|---|
| 174 | --======
|
|---|
| 175 | -- product_price_history
|
|---|
| 176 | --======
|
|---|
| 177 |
|
|---|
| 178 | SET search_path TO myschema;
|
|---|
| 179 |
|
|---|
| 180 | -- master table
|
|---|
| 181 | CREATE TABLE ORDER_STATUS_HISTORY_P (
|
|---|
| 182 | history_id int8 NOT NULL,
|
|---|
| 183 | order_id int8 NOT NULL,
|
|---|
| 184 | old_status varchar(255) NOT NULL,
|
|---|
| 185 | new_status varchar(255) NOT NULL,
|
|---|
| 186 | change_date timestamp with time zone NOT NULL,
|
|---|
| 187 | -- pk contains date
|
|---|
| 188 | PRIMARY KEY (history_id, change_date)
|
|---|
| 189 | ) PARTITION BY RANGE (change_date);
|
|---|
| 190 |
|
|---|
| 191 | -- 2025
|
|---|
| 192 | CREATE TABLE osh_2025_05 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2025-05-01') TO ('2025-06-01');
|
|---|
| 193 | CREATE TABLE osh_2025_06 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2025-06-01') TO ('2025-07-01');
|
|---|
| 194 | CREATE TABLE osh_2025_07 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2025-07-01') TO ('2025-08-01');
|
|---|
| 195 | CREATE TABLE osh_2025_08 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2025-08-01') TO ('2025-09-01');
|
|---|
| 196 | CREATE TABLE osh_2025_09 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2025-09-01') TO ('2025-10-01');
|
|---|
| 197 | CREATE TABLE osh_2025_10 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2025-10-01') TO ('2025-11-01');
|
|---|
| 198 | CREATE TABLE osh_2025_11 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2025-11-01') TO ('2025-12-01');
|
|---|
| 199 | CREATE TABLE osh_2025_12 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2025-12-01') TO ('2026-01-01');
|
|---|
| 200 |
|
|---|
| 201 | -- 2026
|
|---|
| 202 | CREATE TABLE osh_2026_01 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
|
|---|
| 203 | CREATE TABLE osh_2026_02 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');
|
|---|
| 204 | CREATE TABLE osh_2026_03 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2026-03-01') TO ('2026-04-01');
|
|---|
| 205 | CREATE TABLE osh_2026_04 PARTITION OF ORDER_STATUS_HISTORY_P FOR VALUES FROM ('2026-04-01') TO ('2026-05-01');
|
|---|
| 206 |
|
|---|
| 207 | -- DEFAULT
|
|---|
| 208 | CREATE TABLE osh_default PARTITION OF ORDER_STATUS_HISTORY_P DEFAULT;
|
|---|
| 209 |
|
|---|
| 210 | INSERT INTO ORDER_STATUS_HISTORY_P
|
|---|
| 211 | SELECT * FROM order_status_history;
|
|---|
| 212 |
|
|---|
| 213 | ALTER TABLE order_status_history RENAME TO order_status_history_old;
|
|---|
| 214 | ALTER TABLE ORDER_STATUS_HISTORY_P RENAME TO order_status_history;
|
|---|
| 215 |
|
|---|
| 216 | --check
|
|---|
| 217 |
|
|---|
| 218 | EXPLAIN ANALYZE
|
|---|
| 219 | SELECT * FROM order_status_history
|
|---|
| 220 | WHERE order_id = 1789
|
|---|
| 221 | AND change_date >= '2025-06-14'
|
|---|
| 222 | AND change_date < '2025-07-01'
|
|---|
| 223 | AND old_status <> 'CART'; |
|---|