Table Partitioning Strategies: Functions
Module: Query Optimization & Performance
**PostgreSQL Range Partitioning:**
-- Create parent table
CREATE TABLE orders (
order_id BIGSERIAL,
customer_id BIGINT,
created_at TIMESTAMP NOT NULL,
total DECIMAL(10,2)
) PARTITION BY RANGE (created_at);
-- Create partitions
CREATE TABLE orders_2024_01 PARTITION OF orders
FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
CREATE TABLE orders_2024_02 PARTITION OF orders
FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
CREATE TABLE orders_2024_03 PARTITION OF orders
FOR VALUES FROM ('2024-03-01') TO ('2024-04-01');
-- Create indexes (automatically created on all partitions)
CREATE INDEX ON orders (customer_id);
CREATE INDEX ON orders (created_at);
-- Insert data (automatically routed to correct partition)
INSERT INTO orders (customer_id, created_at, total)
VALUES (123, '2024-01-15', 99.99);
-- Goes to orders_2024_01
-- Query with pruning
EXPLAIN SELECT * FROM orders
WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01';
-- Scans only orders_2024_01
**PostgreSQL List Partitioning:**
-- Create parent table
CREATE TABLE orders (
order_id BIGSERIAL,
country VARCHAR(2) NOT NULL,
total DECIMAL(10,2)
) PARTITION BY LIST (country);
-- Create partitions
CREATE TABLE orders_us PARTITION OF orders
FOR VALUES IN ('US');
CREATE TABLE orders_eu PARTITION OF orders
FOR VALUES IN ('UK', 'FR', 'DE', 'IT', 'ES');
CREATE TABLE orders_asia PARTITION OF orders
FOR VALUES IN ('JP', 'CN', 'IN', 'KR');