Muhammad Azeez

Comparing PlanetScale PostgreSQL with Hetzner Local Postgres

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

#postgresql #benchmarking #planetscale #hetzner