Comparing PlanetScale PostgreSQL with Hetzner Local Postgres

2 hours ago 1

PlanetScale’s new $5 single-node PostgreSQL tier (PS-5) promises the same observability/maintenance story you get from their Vitess-backed MySQL side. I wanted to see how it feels next to the very boring Postgres instance I already pay for: a Hetzner CPX11 (2 vCPU / 2 GB RAM for €3.85) running in their eu-central region (Nuremberg). This isn’t even LAN vs internet—it’s literally local disk vs a remote region—so the goal is to get a sanity check, not crown a winner.

I pointed the usual pgbench mix at PlanetScale’s x64 PS-5, PS-10, PS-20, PS-40, PS-80, and PS-160 plans. I asked for eu-central-1 to keep everything close to the Hetzner VPS, but PlanetScale split the replicas across eu-central-1 and eu-central-2, so we roll with what they provisioned. Each plan got hit via the direct endpoint and via PgBouncer. The Hetzner box got the same treatment so we can see how much pooling narrows the gap. Everything lives in mhmd-azeez/hetzner_vs_planetscale if you want to re-run or tweak the tests.

Control plane snapshots

PlanetScale’s Insights and Metrics tabs tell you a lot about how each tier is behaving under load, so here’s a quick gallery of every plan I touched. Tap/click any tile to blow it up.

Direct connections

First pass: raw connections, no pooling tricks, single region hops only.

TPS (transactions/second)

concurrencylocalps5ps10ps20ps40ps80ps160
1406.9729.4324.7024.6723.5928.5024.11
102,445.69256.03261.99278.28257.12268.42272.31
502,487.99-----1,245.58

Direct connection TPS

Higher is better — hover to inspect each plan

Latency (ms)

concurrencylocalps5ps10ps20ps40ps80ps160
12.4633.9840.4940.5342.3835.0941.48
104.0939.0638.1735.9338.8937.2636.72
5020.10-----40.14

Direct connection latency

Lower is better — median latency in milliseconds

PgBouncer

Next pass: slap PgBouncer in front of everything and see how far we can push concurrency before the network becomes the wall.

TPS

concurrencylocalps5ps10ps20ps40ps80ps160
1275.2923.5026.1322.6124.5327.1721.72
101,645.86256.16264.75253.11259.09260.90265.06
501,676.38397.54458.44479.10477.701,204.071,207.27
1001,719.79396.29464.93485.40473.241,200.392,137.35
2001,712.10397.50460.53481.65474.731,196.912,165.73
4001,693.84398.24465.79477.23471.96--

PgBouncer TPS

Higher is better — how pooling scales past 400 concurrent clients

Latency (ms)

concurrencylocalps5ps10ps20ps40ps80ps160
13.6342.5638.2744.2240.7736.8146.05
106.0839.0437.7739.5138.6038.3337.73
5029.83125.77109.07104.36104.6741.5341.42
10058.15252.34215.09206.02211.3183.3146.79
200116.82503.15434.28415.24421.29167.1092.35
400236.151,004.42858.76838.18847.53--

PgBouncer latency

Lower is better — watch how the network hop compounds the tail

Takeaways

  • Latency is the tax: even PS-160 stays ~10× slower on single-connection round trips because physics wins.
  • Pooling earns its keep: once PgBouncer gets involved, PS-160 eventually outruns the local box at extreme concurrency simply because it can hold more connections open at once.
  • Small plans hit ceilings fast: PS-5/10/20 tap out before the 50-connection mark, so plan accordingly if you expect chatty workloads.
  • You still pay for the managed bits: backups, maintenance, branches, and observability are the real pitch for PlanetScale; Hetzner only wins if you’re happy being your own DBA.
Read Entire Article