Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Beginner's Guide to Partitioning vs. Sharding in Postgres | Claire Giordano | PGConf EU 2023

Beginner's Guide to Partitioning vs. Sharding in Postgres | Claire Giordano | PGConf EU 2023

This slide deck is from Claire Giordano's talk at PGConfEU 2023 in Prague, about partitioning and sharding in Postgres. Partitioning has come a long way since the Postgres 10 days, as has sharding via the Citus extension. If you need to scale your Postgres, your friends may recommend you look into partitioning and/or sharding. But what’s the difference between these two approaches?

This beginner’s guide is for those who want to start with the basics and advance from there. You’ll learn what partitioning and sharding are in Postgres; how they’re different; as well as why (and when) these capabilities can help improve query performance. You’ll learn why some people call partitioning invaluable and others call sharding a lifesaver.

But there are gotchas and they’re not for every use case. As David Rowley says, “Understanding why partitioning helps is key to making the decision about whether to partition, what to partition on, and the type and number of partitions.” Similarly, understanding why sharding helps is key to deciding whether sharding is right for you. The concept of data locality will be touched on as well. And for those who prefer to learn by example and not just theory, yes, there will be examples.

Claire Giordano

December 19, 2023
Tweet

More Decks by Claire Giordano

Other Decks in Technology

Transcript

  1. CLAIRE GIORDANO
    @[email protected] • @clairegiordano • @AzureDBPostgres • @citusdata
    Beginner's Guide
    to Partitioning
    vs. Sharding in
    Postgres

    View full-size slide

  2. @clairegiordano
    @[email protected]
    Engineer
    Dev Manager
    PM
    Marketer
    Writer
    Open-source
    champion
    Community Lead

    View full-size slide

  3. 3
    Quite a lot of Postgres work @ Microsoft

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  7. Which led to
    this talk!

    View full-size slide

  8. 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?

    View full-size slide

  9. 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?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. • 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

    View full-size slide

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

    View full-size slide

  14. 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)

    View full-size slide

  15. 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”

    View full-size slide

  16. 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...

    View full-size slide

  17. 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

    View full-size slide

  18. 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);

    View full-size slide

  19. 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

    View full-size slide

  20. 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');

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  23. 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?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  27. 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

    View full-size slide

  28. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  34. 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

    View full-size slide

  35. 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”

    View full-size slide

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

    View full-size slide

  37. 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?

    View full-size slide

  38. 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

    View full-size slide

  39. 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

    View full-size slide

  40. 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

    View full-size slide

  41. 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?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  44. 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

    View full-size slide

  45. 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

    View full-size slide

  46. 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

    View full-size slide

  47. 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

    View full-size slide

  48. 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

    View full-size slide

  49. 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

    View full-size slide

  50. 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

    View full-size slide

  51. 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

    View full-size slide

  52. 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

    View full-size slide

  53. 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

    View full-size slide

  54. 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

    View full-size slide

  55. 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

    View full-size slide

  56. 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

    View full-size slide

  57. 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?

    View full-size slide

  58. Why
    partitioning
    can help
    improve
    query
    performance
    Partition Pruning

    View full-size slide

  59. Why
    partitioning
    can help
    improve
    query
    performance
    Data Locality

    View full-size slide

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

    View full-size slide

  61. 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?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  64. 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?

    View full-size slide

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

    View full-size slide

  66. 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)

    View full-size slide

  67. 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)

    View full-size slide

  68. 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';

    View full-size slide

  69. 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)

    View full-size slide

  70. 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)

    View full-size slide

  71. 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?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  75. Why
    sharding can
    help query
    performance
    Co-Located Tables

    View full-size slide

  76. 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

    View full-size slide

  77. 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?

    View full-size slide

  78. 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

    View full-size slide

  79. So what are the
    takeaways?

    View full-size slide

  80. 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

    View full-size slide

  81. 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

    View full-size slide

  82. 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

    View full-size slide

  83. 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

    View full-size slide

  84. 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

    View full-size slide

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

    View full-size slide

  86. @clairegiordano
    @[email protected]
    aka.ms/PathToCitusCon
    z

    View full-size slide