Slide 1

Slide 1 text

CLAIRE GIORDANO @clairegiordano@hachyderm.io • @clairegiordano • @AzureDBPostgres • @citusdata Beginner's Guide to Partitioning vs. Sharding in Postgres

Slide 2

Slide 2 text

@clairegiordano @clairegiordano@hachyderm.io Engineer Dev Manager PM Marketer Writer Open-source champion Community Lead

Slide 3

Slide 3 text

3 Quite a lot of Postgres work @ Microsoft

Slide 4

Slide 4 text

4 Quite a lot of Postgres work @ Microsoft aka.ms/blog-pg-at-microsoft

Slide 5

Slide 5 text

Inspiration for this talk came from a #PGSQLPhriday community blog-fest back in August 2023 Hosted by Tomasz Gintowt

Slide 6

Slide 6 text

So I wrote a thing for PGSQL Phriday “Understanding Partitioning and Sharding in Postgres and Citus” aka.ms/blog-partitioning-sharding-claire

Slide 7

Slide 7 text

Which led to this talk!

Slide 8

Slide 8 text

8 What is sharding? Partitioning + sharding together How partitioning & sharding are different Why partitioning helps query performance When partitioning helps query performance Why sharding helps query performance When sharding helps query performance This Beginner Guide… What is Postgres partitioning?

Slide 9

Slide 9 text

9 What is sharding? Partitioning + sharding together How partitioning & sharding are different Why partitioning helps query performance When partitioning helps query performance Why sharding helps query performance When sharding helps query performance Part 1 What is Postgres partitioning?

Slide 10

Slide 10 text

What is Postgres table partitioning Let’s say this huge Redwood Tree is like a big Postgres table...

Slide 11

Slide 11 text

What is Postgres table partitioning What if we could split this tree trunk into many smaller logs, & only work with the ones we need?

Slide 12

Slide 12 text

• Splits large tables into many smaller tables (partitions) • Built-in, native feature in Postgres • Needs to be declared up-front when you first CREATE TABLE

Slide 13

Slide 13 text

So many improvements to Postgres partitioning in last 5-6 years Shout-out to @Brandur for this blog post... aka.ms/partitioning-2022-brandur

Slide 14

Slide 14 text

14 What are the benefits of Postgres Partitioning? Can improve query performance Improves performance of bulk deletes /if DROP PARTITION Improves performance of autovacuum /in so many cases!! Enables you to optimize storage costs (cheap vs. expensive)

Slide 15

Slide 15 text

In Postgres, trying to remove old rows from a large, hot table is flitting with disaster. A long running query must iterate through and mark each one as dead, and even then nothing is reclaimed until an equally expensive vacuum runs through and frees space, and only when it's allowed to after rows are no longer visible to any other query in the system, “ — Brandur whether they're making use of the large table or not. Each row removal land in the WAL, resulting in significant amplification. But with partitions, deletion becomes a simple DROP TABLE. It executes instantly, and with negligible costs (partitioning has other benefits too). The trade-off is maintenance." From Brandur.org Title of post: “Partitioning in Postgres, 2022 Edition”

Slide 16

Slide 16 text

16 Declarative Postgres partitioning has 3 partitioning methods PARTITION BY RANGE PARTITION BY LIST PARTITION BY HASH Time-series & IOT Countries, company divisions,… When partitioning by range & by list do not work...

Slide 17

Slide 17 text

17 Tracking monthly concert revenue for Taylor Swift Step 1: Decide on partition method Step 2: Decide on partition key Step 3: Create a partitioned table Step 4: Create partitions

Slide 18

Slide 18 text

18 Let’s create a partitioned table CREATE TABLE concert_revenue ( city_id int not null, sale_date date not null, merch_sales int, ticket_sales int ) PARTITION BY RANGE (sale_date);

Slide 19

Slide 19 text

19 Let’s create our first partition for June 2023 CREATE TABLE concert_revenue_cy2023m06 PARTITION OF concert_revenue FOR VALUES FROM ('2023-06-01') TO ('2023-07-01'); TIP: lower bound is INCLUSIVE TIP: upper bound (2023-07-01) is NOT inclusive

Slide 20

Slide 20 text

20 Let’s create 3 partitions for Jun / Jul / Aug 2023 CREATE TABLE concert_revenue_cy2023m06 PARTITION OF concert_revenue FOR VALUES FROM ('2023-06-01') TO ('2023-07-01'); CREATE TABLE concert_revenue_cy2023m07 PARTITION OF concert_revenue FOR VALUES FROM ('2023-07-01') TO ('2023-08-01'); CREATE TABLE concert_revenue_cy2023m08 PARTITION OF concert_revenue FOR VALUES FROM ('2023-08-01') TO ('2023-09-01');

Slide 21

Slide 21 text

21 Later, you can delete older data—e.g. June 2023 DROP TABLE concert_revenue_cy2023m06;

Slide 22

Slide 22 text

Partitioning is not magic! ...You need to maintain these partitions pg_partman with pg_cron

Slide 23

Slide 23 text

23 What is sharding? Partitioning + sharding together How partitioning & sharding are different Why partitioning helps query performance When partitioning helps query performance Why sharding helps query performance When sharding helps query performance Part 2 What is Postgres partitioning?

Slide 24

Slide 24 text

What is sharding? 24 Splitting Postgres tables into smaller tables (“shards”)

Slide 25

Slide 25 text

What is sharding? 25 Splitting Postgres tables into smaller tables (“shards”) Distributing shards horizontally across multiple nodes

Slide 26

Slide 26 text

“A rose by any other name is still a rose” Other terms people use for Sharding 26 Horizontal Sharding Scaling out Horizontally Distributed Postgres

Slide 27

Slide 27 text

Back to previous metaphor If you have one big ginormous tree trunk & you want to split it into smaller pieces & distribute it across multiple parts of forest

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

29 3 common ways to shard Postgres 2 1 Partitions + postgres_fdw Manual sharding sometimes called “sharding at application layer” Create hash-partitioned Postgres table in which every partition is a foreign table using postgres_fdw 3 Citus Extension to Postgres Open source, & also a managed service

Slide 30

Slide 30 text

Bulk of sharding work done by... 2 1 3 DBA Citus Dev App Dev Partitions + postgres_fdw Manual sharding Citus

Slide 31

Slide 31 text

In today’s talk, we’ll focus on sharding with Citus extension to Postgres

Slide 32

Slide 32 text

32 Diagram of sharding Postgres with Citus Postgres Single Node Distributed Citus cluster with shards (smaller tables) on each node in cluster

Slide 33

Slide 33 text

33 Citus extension = LOT more than sharding aka.ms/blog-citus-technical-readme

Slide 34

Slide 34 text

Pic from yesterday’s Distributed PostgreSQL talk at PGConfEU (by Marco Slot)

Slide 35

Slide 35 text

35 Benefit of sharding Postgres with Citus: >>>> Get more Performance & Scale than you can eek out on a single node Can improve query performance @ scale //due to all the memory, CPU, & disk from multi-node cluster Enables your application to grow & scale // not just now, but in future Improves performance of autovacuum //since it runs in parallel across all the nodes in the cluster

Slide 36

Slide 36 text

36 How to distribute tables with Citus for row-based sharding SELECT create_distributed_table( 'table_name', ‘sharding_key'); N.B. “sharding key” is often called a “distribution column”

Slide 37

Slide 37 text

37 New to Citus 12.0, a 2nd way to shard: schema-based sharding SELECT citus_schema_distribute( 'name');

Slide 38

Slide 38 text

38 What is sharding? Partitioning + sharding together How partitioning & sharding are different Why partitioning helps query performance When partitioning helps query performance Why sharding helps query performance When sharding helps query performance Part 3 What is Postgres partitioning?

Slide 39

Slide 39 text

39 Can you Partition & Shard together? Single PG node Partitions on a single Postgres node Sharded Postgres partitions on a distributed 4-node Citus cluster Node 1 Node 2 Node 3 Node 4

Slide 40

Slide 40 text

40 These two Citus UDFs simplify partition management create_time_partitions(table_name regclass, partition_interval interval, end_at timestamp with time zone, start_from timestamp with time zone DEFAULT now()) #1—Create as many partitions as necessary for given time range

Slide 41

Slide 41 text

41 These 2 Citus UDFs simplify partition management drop_old_time_partitions(table_name regclass, older_than timestamp with time zone) #2—Drop all partitions older than given timestamp

Slide 42

Slide 42 text

42 What is sharding? Partitioning + sharding together How partitioning & sharding are different Why partitioning helps query performance When partitioning helps query performance Why sharding helps query performance When sharding helps query performance Part 4 What is Postgres partitioning?

Slide 43

Slide 43 text

Let’s look at a comparison table! How partitioning & sharding are different

Slide 44

Slide 44 text

Postgres native Partitioning Sharding with Citus extension Partitioning + Sharding Combination 2 1 3 0 Aspects or attributes of these technologies

Slide 45

Slide 45 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 46

Slide 46 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 47

Slide 47 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 48

Slide 48 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 49

Slide 49 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 50

Slide 50 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 51

Slide 51 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 52

Slide 52 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 53

Slide 53 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 54

Slide 54 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 55

Slide 55 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 56

Slide 56 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 57

Slide 57 text

Attribute Partitioning Citus Sharding Partition + Shard Combo Built into Postgres Extension to Postgres Single node Multi-node Drop old data quickly Parallel, distributed SQL/DDL/DML Partition/Shard Pruning Parallel autovacuum Better index cache hit ratios Automatic maintenance Time series apps (e.g. IOT) Multi-tenant SaaS apps

Slide 58

Slide 58 text

58 What is sharding? Partitioning + sharding together How partitioning & sharding are different Why partitioning helps query performance When partitioning helps query performance Why sharding helps query performance When sharding helps query performance Part 5 What is Postgres partitioning?

Slide 59

Slide 59 text

Why partitioning can help improve query performance Partition Pruning

Slide 60

Slide 60 text

Why partitioning can help improve query performance Data Locality

Slide 61

Slide 61 text

Why partitioning can help improve query performance Partition Pruning Data Locality &

Slide 62

Slide 62 text

62 What is sharding? Partitioning + sharding together How partitioning & sharding are different Why partitioning helps query performance When partitioning helps query performance Why sharding helps query performance When sharding helps query performance Part 6 What is Postgres partitioning?

Slide 63

Slide 63 text

When partitioning helps improve query performance Just like when you bake a cake, need essential ingredients to get the right result

Slide 64

Slide 64 text

When partitioning helps improve query performance Only when you use a WHERE clause that prunes (excludes) partitions from the query

Slide 65

Slide 65 text

65 Remember that Taylor Swift concert example... Tracking monthly concert revenues... What if we wanted to know what the August revenue was from ticket sales + merch sales?

Slide 66

Slide 66 text

66 This EXPLAIN query is missing WHERE clause EXPLAIN (costs off) SELECT count(*) FROM concert_revenue;

Slide 67

Slide 67 text

67 So it has to scan all 3 of the partitions  EXPLAIN (costs off) SELECT count(*) FROM concert_revenue; QUERY PLAN --------------------------------------------------------------------- Aggregate -> Append -> Seq Scan on concert_revenue_cy2023m06 concert_revenue_1 -> Seq Scan on concert_revenue_cy2023m07 concert_revenue_2 -> Seq Scan on concert_revenue_cy2023m08 concert_revenue_3 (5 rows)

Slide 68

Slide 68 text

68 And doesn’t benefit from partition pruning  EXPLAIN (costs off) SELECT count(*) FROM concert_revenue; QUERY PLAN --------------------------------------------------------------------- Aggregate -> Append -> Seq Scan on concert_revenue_cy2023m06 concert_revenue_1 -> Seq Scan on concert_revenue_cy2023m07 concert_revenue_2 -> Seq Scan on concert_revenue_cy2023m08 concert_revenue_3 (5 rows)

Slide 69

Slide 69 text

69 This EXPLAIN query includes a WHERE clause EXPLAIN (costs off) SELECT count(*) FROM concert_revenue WHERE sale_date BETWEEN '2023-08-01' AND '2023-08-31';

Slide 70

Slide 70 text

70 And so it only needs to scan the Aug partition EXPLAIN (costs off) SELECT count(*) FROM concert_revenue WHERE sale_date BETWEEN '2023-08-01' AND '2023-08-31’; QUERY PLAN --------------------------------------------------------------------- ---------------------- Aggregate -> Seq Scan on concert_revenue_cy2023m08 concert_revenue Filter: ((sale_date >= '2023-08-01'::date) AND (sale_date <= '2023-08-31'::date)) (3 rows)

Slide 71

Slide 71 text

71 And so it only needs to scan the Aug partition EXPLAIN (costs off) SELECT count(*) FROM concert_revenue WHERE sale_date BETWEEN '2023-08-01' AND '2023-08-31’; QUERY PLAN --------------------------------------------------------------------- ---------------------- Aggregate -> Seq Scan on concert_revenue_cy2023m08 concert_revenue Filter: ((sale_date >= '2023-08-01'::date) AND (sale_date <= '2023-08-31'::date)) (3 rows)

Slide 72

Slide 72 text

72 What is sharding? Partitioning + sharding together How partitioning & sharding are different Why partitioning helps query performance When partitioning helps query performance Why sharding helps query performance When sharding helps query performance Part 7 What is Postgres partitioning?

Slide 73

Slide 73 text

Why sharding can help query performance Let’s say this huge Redwood Tree is like a big Postgres table... More CPU, Memory, Disk

Slide 74

Slide 74 text

Why sharding can help query performance Let’s say this huge Redwood Tree is like a big Postgres table... More CPU, Memory, Disk

Slide 75

Slide 75 text

Why sharding can help query performance Let’s say this huge Redwood Tree is like a big Postgres table... Shard Pruning Logic

Slide 76

Slide 76 text

Why sharding can help query performance Co-Located Tables

Slide 77

Slide 77 text

Why sharding can help query performance Let’s say this huge Redwood Tree is like a big Postgres table... Shard Pruning Logic Co-Located Tables More CPU, Memory, Disk

Slide 78

Slide 78 text

78 What is sharding? Partitioning + sharding together How partitioning & sharding are different Why partitioning helps query performance When partitioning helps query performance Why sharding helps query performance When sharding helps query performance Part 8 What is Postgres partitioning?

Slide 79

Slide 79 text

When sharding helps improve query performance Let’s say this huge Redwood Tree is like a big Postgres table... CPU Memory Disk CPU Memory Disk CPU Memory Disk CPU Memory Disk CPU Memory Disk CPU Memory Disk CPU Memory Disk + + + + + When your application needs more cpu, memory, or disk than is possible on a single Postgres node Common example: “Cache hit ratio” has been going down—leading to slower query response times

Slide 80

Slide 80 text

So what are the takeaways?

Slide 81

Slide 81 text

81 Takeaways about PG Partitioning & Sharding 1. Partitioning & Sharding can be “Invaluable” and “Lifesavers” 3. Planning required 2. You don’t have to pick between Partitioning & Sharding 4. Keys Matter

Slide 82

Slide 82 text

82 Takeaways about PG Partitioning & Sharding 1. Partitioning & Sharding can be “Invaluable” and “Lifesavers” 3. Planning required 2. You don’t have to pick between Partitioning & Sharding 4. Keys Matter

Slide 83

Slide 83 text

83 Takeaways about PG Partitioning & Sharding 1. Partitioning & Sharding can be “Invaluable” and “Lifesavers” 3. Planning required 2. You don’t have to pick between Partitioning & Sharding 4. Keys Matter

Slide 84

Slide 84 text

84 Takeaways about PG Partitioning & Sharding 1. Partitioning & Sharding can be “Invaluable” and “Lifesavers” 3. Planning required 2. You don’t have to pick between Partitioning & Sharding 4. Keys Matter

Slide 85

Slide 85 text

People to thank for inspiration &or reviews Daniel Gustafsson David Rowley Isaac Alves Jelte Fennema-Nio Marco Slot Melanie Plageman Robert Treat Ryan Booz Thomas Munro Umur Cubukcu Charles Feddersen

Slide 86

Slide 86 text

aka.ms/PathToCitusCon A podcast for developers who love Postgres

Slide 87

Slide 87 text

@clairegiordano @clairegiordano@hachyderm.io aka.ms/PathToCitusCon z