w3resource

Guide to Partitioning Existing Tables in PostgreSQL


Partitioning an Existing Table in PostgreSQL

Partitioning in PostgreSQL is a powerful technique to improve query performance and manage large datasets. Partitioning an existing table allows you to split it into smaller, manageable chunks based on specific criteria like ranges or values, improving query efficiency and maintenance.

This guide explains how to partition an existing PostgreSQL table step-by-step using declarative partitioning.


Syntax:

    1. Create a Partitioned Table

    Convert the existing table to a partitioned table by creating a new table with the PARTITION BY clause.

    2. Create Partitions

    Define child tables (partitions) using the appropriate FOR VALUES clause.

    3. Move Data into Partitions

    Populate the new partitions by inserting or copying data from the existing table.

    4. Replace Existing Table

    Optionally, drop the original table and rename the new partitioned table.

Steps and Examples

Step 1: Create a New Partitioned Table

Code:

-- Step 1: Create a new partitioned table
CREATE TABLE sales_partitioned (
    id SERIAL PRIMARY KEY,          -- Primary key column
    sale_date DATE NOT NULL,        -- Partitioning column
    amount NUMERIC(10, 2) NOT NULL  -- Other data
) PARTITION BY RANGE (sale_date);   -- Partitioning strategy

Explanation:

  • The PARTITION BY RANGE clause specifies that the table will be partitioned by ranges of sale_date.

Step 2: Create Partitions

Code:

-- Step 2: Create partitions for the table
CREATE TABLE sales_2022 PARTITION OF sales_partitioned
    FOR VALUES FROM ('2022-01-01') TO ('2023-01-01');  -- Data for 2022

CREATE TABLE sales_2023 PARTITION OF sales_partitioned
    FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');  -- Data for 2023

Explanation:

  • Each child table (sales_2022, sales_2023) stores data for a specific range of dates.

Step 3: Migrate Data to Partitions

Code:

-- Step 3: Insert data into the partitioned table
INSERT INTO sales_partitioned (id, sale_date, amount)
SELECT id, sale_date, amount FROM sales;  -- Copy data from the original table

Explanation:

  • Use the INSERT INTO ... SELECT query to migrate data from the original table (sales) to the new partitioned table.

Step 4: Drop Original Table (Optional)

Code:

-- Step 4: Drop the original table and rename the partitioned table
DROP TABLE sales;                       -- Remove the old table
ALTER TABLE sales_partitioned RENAME TO sales;  -- Rename the partitioned table

Explanation:

  • Once data migration is complete, replace the original table with the partitioned table for seamless integration with existing applications

Benefits of Partitioning

    1. Improved Query Performance: Queries can target specific partitions, reducing the dataset size.

    2. Easier Maintenance: Archiving and deleting old data is simpler with partitions.

    3. Scalability: Handles large datasets efficiently by splitting them into manageable parts.

Additional Considerations

  • Indexes: Create indexes on partitions if needed. Indexes are not inherited from the parent table.
  • Constraints: Some constraints like FOREIGN KEY are not supported on partitioned tables.
  • Partition Pruning: PostgreSQL automatically optimizes queries by excluding irrelevant partitions.

All PostgreSQL Questions, Answers, and Code Snippets Collection.



Become a Patron!

Follow us on Facebook and Twitter for latest update.

It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.

https://w3resource.com/PostgreSQL/snippets/postgresql-partition-existing-table.php