PgPartitioning

<img src=“https://codeclimate.com/github/victor-magarlamov/pg_partitioning/badges/gpa.svg” /> <img src=“https://codeclimate.com/github/victor-magarlamov/pg_partitioning/badges/coverage.svg” />

This project rocks and uses MIT-LICENSE.

Install

Put this line in your Gemfile:

gem 'pg_partitioning'

Then bundle:

% bundle install

Usage

% RAILS_ENV=production rails g partitioning

1) Select the partitioning mode:

  • by single column value

  • by dates template

  • by range

2) Enter table name.

3) Enter column name.

4) Enter condition depending on the selected mode - template pattern or range step.

What will happen then…

1) The generator will create two triggers: before insert and after insert. The before insert trigger executes the procedure that created nested table and inserts a new record into it. The after trigger clears the master table.

2) Foreign keys which reference to the master table will delete.

3) Old data will be migrated from master table to child tables.

For more details, see …

Examples

Given we have table ‘bandits’:

| id | name | specialization | born_at

Example 1: Partitioning by single column value

Enter mode: 0
Enter table: bandits
Enter column: specialization

Create two bandits:

Bandit.create([{name: 'Al Capone', specialization: 'bootlegger'},
               {name: 'Black Bart', specialization: 'robber'}])

Now we have three tables:

  • bandits - master - not contains real data

  • bandits_bootlegger - nested - contains only the bootleggers

  • bandits_robber - nested - contains only the robbers

Check this…

SELECT COUNT(*) FROM bandits; (2)
SELECT COUNT(*) FROM ONLY bandits; (0)
SELECT COUNT(*) FROM ONLY bandits_bootlegger; (1)
SELECT COUNT(*) FROM ONLY bandits_robber; (1)

Example 2: Partitioning by range

Enter mode: 1
Enter table: bandits
Enter column: id
Enter step: 10

All bandits with ID from 0 to 9 will be recorded to table ‘bandits_0’. All bandits with ID from 10 to 19 will be recorded to table ‘bandits_1’. All bandits with ID from 20 to 29 will be recorded to table ‘bandits_2’ etc.

Example 3: Partitioning by date template

Enter mode: 2
Enter table: bandits
Enter column: born_at
Enter pattern: YYYYMM

Create two bandits:

Bandit.create([{name: 'Al Capone', born_at: '1899-01-17'},
               {name: 'Charles Luciano', born_at: '1897-11-24'}])

And now we have two child tables:

  • bandits_1899_01

  • bandits_1897_11