Question: How do you partition a large table in PostgreSQL?


Partitioning a large table in PostgreSQL can significantly improve query performance and manageability by dividing the table into smaller, more manageable pieces called partitions. Here's a comprehensive guide on how to do it:

Step 1: Decide on Partitioning Key

First, identify the column(s) that will be used as the partitioning key. Common choices include timestamps (for time-based partitioning) or IDs (for range or list partitioning).

Step 2: Choose Partitioning Strategy

PostgreSQL supports three primary partitioning strategies:

  • Range Partitioning: Divides data into ranges based on the partition key. Useful for time-series data.
  • List Partitioning: Each partition is defined for a list of specific key values.
  • Hash Partitioning: Data is distributed across partitions based on a hash key.

Step 3: Create Parent Table

Create the parent table without any data. This table will define the structure of all partitions.

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

Step 4: Create Partitions

Next, create the partitions. Each partition must specify the range or list that defines it.

For range partitioning (e.g., monthly partitions):

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

And so forth for each month or period of interest.

Step 5: Insert Data

Insert data into the parent table as usual. PostgreSQL automatically routes the data to the correct partition based on the partitioning rules.

INSERT INTO measurement (city_id, logdate, peaktemp, unitsales) VALUES (1, '2023-01-15', 45, 100);

Step 6: Querying

Queries against the parent table will automatically search the appropriate partitions. For example:

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

Best Practices

  • Keep the number of partitions reasonable. Too many partitions can degrade performance.
  • Regularly review the partitioning strategy to ensure it aligns with your access patterns.
  • Consider using index and constraint exclusion to further improve query performance.

Partitioning a large table in PostgreSQL requires careful planning but can yield significant benefits in terms of performance and scalability.

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.