Question: What is the difference between clustering and partitioning in PostgreSQL?

Answer

In PostgreSQL, both clustering and partitioning are techniques used to manage how data is stored and accessed, but they serve different purposes and operate in distinct ways.

Clustering

In PostgreSQL, 'clustering' refers to the CLUSTER command that allows you to reorder a table's physical storage based on the index. It physically reorders the table rows to match the order of the index specified. This can improve the performance of queries that fetch large ranges of rows but typically only for read-heavy scenarios as this ordering is not preserved during subsequent DML operations (INSERT, UPDATE, DELETE).

Here’s a simple example on how to use the CLUSTER command:

-- Assuming my_table has an index my_index CLUSTER my_table USING my_index;

Remember, after major changes to the table, you might need to re-cluster it because the benefits of clustering degrade over time as the table is updated.

Partitioning

Partitioning, on the other hand, is a technique used to divide a large table into smaller, more manageable pieces, called partitions, while still treating them as a single table. Each partition can be stored on a different physical location and queried independently, which can significantly improve performance for queries involving large datasets. There are several ways to partition a table in PostgreSQL, such as range, list, and hash partitioning.

Here’s an example of creating a range-partitioned table:

CREATE TABLE measurement ( city_id int not null, logdate date not null, peaktemp int, unitsales decimal ) PARTITION BY RANGE (logdate); CREATE TABLE measurement_y2006m02 PARTITION OF measurement FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');

In this case, you can have separate tables for each month’s data but query them as if they were a single table.

Conclusion

The choice between clustering and partitioning depends on specific use cases. Use clustering when you need to optimize read operations on a static snapshot of data, and use partitioning when dealing with large volumes of data that need to be divided into smaller chunks for performance reasons or management simplicity.

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.