Question: How do you implement table partitioning in PostgreSQL?


Table partitioning in PostgreSQL is a technique used to divide large tables into smaller, more manageable pieces, while still allowing them to be queried together as a single table. This can significantly improve performance for queries that can be limited to specific partitions and also simplifies data management tasks such as data purging or archival. Here's a step-by-step example of partitioning a table by range in PostgreSQL:

Step 1: Create the Parent Table

First, create the parent table without including data. This table will define the structure for the partitions.

CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales int ) PARTITION BY RANGE (logdate);

Step 2: Create Partition Tables

Next, create partition tables that inherit from the parent table. You must specify the range each partition covers using FOR VALUES FROM and TO.

CREATE TABLE measurement_y2023m01 PARTITION OF measurement FOR VALUES FROM ('2023-01-01') TO ('2023-02-01'); CREATE TABLE measurement_y2023m02 PARTITION OF measurement FOR VALUES FROM ('2023-02-01') TO ('2023-03-01');

In this example, two partitions are created, one for each month of January and February 2023.

Step 3: Inserting Data

When inserting data into measurement, PostgreSQL automatically routes the data to the correct partition based on the logdate.

INSERT INTO measurement(city_id, logdate, peaktemp, unitsales) VALUES (1, '2023-01-15', 35, 100); INSERT INTO measurement(city_id, logdate, peaktemp, unitsales) VALUES (2, '2023-02-15', 40, 150);

The first insert goes into measurement_y2023m01, and the second into measurement_y2023m02.

Step 4: Querying Data

You can query the parent table directly, and PostgreSQL will fetch data from all partitions seamlessly.

SELECT * FROM measurement WHERE logdate BETWEEN '2023-01-01' AND '2023-02-28';

This query returns all records from January and February 2023 across both partitions.

Benefits and Considerations

  • Performance: Queries that filter on the partition key can be significantly faster because they only scan relevant partitions.
  • Management: Easier data lifecycle management, such as dropping old partitions instead of using DELETE operations.

Make sure that the choice of partition key and ranges aligns well with your query patterns for maximum benefit.

Was this content helpful?

White Paper

Free System Design on AWS E-Book

Download this early release of O'Reilly's latest cloud infrastructure e-book: System Design on AWS.

Free System Design on AWS E-Book

Start building today

Dragonfly is fully compatible with the Redis ecosystem and requires no code changes to implement.