SQL Practice Logo

SQLPractice Online

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');