Question: What is the clustering algorithm in PostgreSQL?


PostgreSQL utilizes a process known as clustering to reorganize the data within a table based on the index's order. This can significantly improve the performance of the database, especially for queries that benefit from the related rows being physically close together.

How does Clustering Work in PostgreSQL?

In PostgreSQL, clustering is an operation that sorts table data physically by the columns specified in an index. When you cluster a table, PostgreSQL rearranges the actual data rows to match the order of the index. This is particularly useful for large tables where frequent queries access many or most of the rows.

To perform a clustering operation, you first need an index on the table. Then you use the CLUSTER command to sort the table according to that index. Here’s a basic example:

-- Creating an index CREATE INDEX idx_employee_on_department ON employee(department_id); -- Clustering the table based on the created index CLUSTER employee USING idx_employee_on_department;

Important Points about Clustering

  • One-time Operation: Clustering is a one-time operation. If the table is updated after clustering (inserts, updates, deletes), the table might need to be reclustered to maintain any benefits.
  • Transaction and Locking: The clustering operation requires an exclusive lock on the table, which means it can prevent other operations on the table until it completes.
  • No Automatic Maintenance: PostgreSQL does not automatically maintain the order after a cluster operation. For recurring benefits, you may need to periodically recluster the table or use features like autovacuum to maintain table statistics and performance.

Using the CLUSTER Command

You can also set a table to be clustered by default on a specific index, simplifying future reclustering:

-- Set the default index for clustering ALTER TABLE employee SET WITHOUT CLUSTER; ALTER TABLE employee SET WITH CLUSTER USING idx_employee_on_department; -- Whenever re-clustering is needed CLUSTER employee;

This will ensure that every time CLUSTER employee is called without specifying an index, it will use idx_employee_on_department.

When to Use Clustering

Clustering is best used in scenarios where read performance is critical and the table data does not change frequently, or you can manage to recluster periodically. Tables that are mostly read but seldom updated are ideal candidates for clustering.

By organizing the table rows according to an index, clustering can provide faster query performance for operations that can utilize the sort order, such as range queries or scans that benefit from sequential disk reads.

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.