Managing Partitions - HashΒΆ

Let us understand how to manage partitions using table users_hash_part which is partitioned using hash.

  • We would like to divide our data into 8 hash buckets.

  • While adding partitions for hash partitioned table, we need to specify modulus and remainder.

  • For each and every record inserted, following will happen for the column specified as partitioned key.

    • A hash will be computed. Hash is nothing but an integer.

    • The integer generated will be divided by the value specified in modulus.

    • Based up on the remainder, the record will be inserted into corresponding partition.

%load_ext sql
The sql extension is already loaded. To reload it, use:
  %reload_ext sql
%env DATABASE_URL=postgresql://itversity_sms_user:sms_password@localhost:5432/itversity_sms_db
env: DATABASE_URL=postgresql://itversity_sms_user:sms_password@localhost:5432/itversity_sms_db

Error

We cannot have a default partition for hash partitioned table.

%%sql

CREATE TABLE users_hash_part_default
PARTITION OF users_hash_part DEFAULT
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
(psycopg2.errors.InvalidTableDefinition) a hash-partitioned table may not have a default partition

[SQL: CREATE TABLE users_hash_part_default PARTITION OF users_hash_part DEFAULT]
(Background on this error at: http://sqlalche.me/e/13/f405)

Note

Let us add partitions using modulus as 8. For each remainder between 0 to 7. we need to add a partition.

%%sql

CREATE TABLE users_hash_part_0_of_8
PARTITION OF users_hash_part
FOR VALUES WITH (modulus 8, remainder 0)
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
Done.
[]
%%sql

CREATE TABLE users_hash_part_1_of_8
PARTITION OF users_hash_part
FOR VALUES WITH (modulus 8, remainder 1)
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
Done.
[]
%%sql

CREATE TABLE users_hash_part_2_of_8
PARTITION OF users_hash_part
FOR VALUES WITH (modulus 8, remainder 2)
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
Done.
[]
%%sql

CREATE TABLE users_hash_part_3_of_8
PARTITION OF users_hash_part
FOR VALUES WITH (modulus 8, remainder 3)
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
Done.
[]
%%sql

CREATE TABLE users_hash_part_4_of_8
PARTITION OF users_hash_part
FOR VALUES WITH (modulus 8, remainder 4)
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
Done.
[]
%%sql

CREATE TABLE users_hash_part_5_of_8
PARTITION OF users_hash_part
FOR VALUES WITH (modulus 8, remainder 5)
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
Done.
[]
%%sql

CREATE TABLE users_hash_part_6_of_8
PARTITION OF users_hash_part
FOR VALUES WITH (modulus 8, remainder 6)
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
Done.
[]
%%sql

CREATE TABLE users_hash_part_7_of_8
PARTITION OF users_hash_part
FOR VALUES WITH (modulus 8, remainder 7)
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
Done.
[]
%%sql

INSERT INTO users_hash_part
    (user_first_name, user_last_name, user_email_id, created_dt)
VALUES 
    ('Scott', 'Tiger', 'scott@tiger.com', '2018-10-01'),
    ('Donald', 'Duck', 'donald@duck.com', '2019-02-10'),
    ('Mickey', 'Mouse', 'mickey@mouse.com', '2017-06-22')
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
3 rows affected.
[]

Note

user_id is populated by sequence. The hash of every sequence generated integer will be divided by modulus (which is 8) and based up on the remainder data will be inserted into corresponding partition.

%%sql

SELECT * FROM users_hash_part
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
3 rows affected.
user_id user_first_name user_last_name user_email_id user_email_validated user_password user_role is_active created_dt last_updated_ts
1 Scott Tiger scott@tiger.com False None U False 2018-10-01 2020-11-24 12:13:06.353736
3 Mickey Mouse mickey@mouse.com False None U False 2017-06-22 2020-11-24 12:13:06.353736
2 Donald Duck donald@duck.com False None U False 2019-02-10 2020-11-24 12:13:06.353736
%%sql

SELECT * FROM users_hash_part_0_of_8
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
1 rows affected.
user_id user_first_name user_last_name user_email_id user_email_validated user_password user_role is_active created_dt last_updated_ts
1 Scott Tiger scott@tiger.com False None U False 2018-10-01 2020-11-24 12:13:06.353736
%%sql

SELECT * FROM users_hash_part_1_of_8
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
1 rows affected.
user_id user_first_name user_last_name user_email_id user_email_validated user_password user_role is_active created_dt last_updated_ts
3 Mickey Mouse mickey@mouse.com False None U False 2017-06-22 2020-11-24 12:13:06.353736
%%sql

SELECT * FROM users_hash_part_2_of_8
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
1 rows affected.
user_id user_first_name user_last_name user_email_id user_email_validated user_password user_role is_active created_dt last_updated_ts
2 Donald Duck donald@duck.com False None U False 2019-02-10 2020-11-24 12:13:06.353736
%%sql

SELECT * FROM users_hash_part_3_of_8
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
0 rows affected.
user_id user_first_name user_last_name user_email_id user_email_validated user_password user_role is_active created_dt last_updated_ts
%%sql

SELECT * FROM users_hash_part_4_of_8
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
0 rows affected.
user_id user_first_name user_last_name user_email_id user_email_validated user_password user_role is_active created_dt last_updated_ts
%%sql

SELECT * FROM users_hash_part_5_of_8
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
0 rows affected.
user_id user_first_name user_last_name user_email_id user_email_validated user_password user_role is_active created_dt last_updated_ts
%%sql

SELECT * FROM users_hash_part_6_of_8
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
0 rows affected.
user_id user_first_name user_last_name user_email_id user_email_validated user_password user_role is_active created_dt last_updated_ts
%%sql

SELECT * FROM users_hash_part_7_of_8
 * postgresql://itversity_sms_user:***@localhost:5432/itversity_sms_db
0 rows affected.
user_id user_first_name user_last_name user_email_id user_email_validated user_password user_role is_active created_dt last_updated_ts