We've talked to a lot of teams convinced they need to shard Postgres. About one in five actually does. The other four needed an index, a query rewrite, or a read replica.
What Postgres can comfortably do in 2026
- Aurora Postgres or RDS Postgres on r6i.4xlarge: ~10K writes/sec, ~30K reads/sec sustained.
- A well-indexed 1TB database: sub-50ms p99 for transactional queries.
- Tens of millions of rows per table without partitioning, if your queries are hot-path-aware.
Most SaaS companies hit none of these limits in the first three years.
Buy yourself a year, four ways
1. Reads to replicas
Move analytics queries, dashboards, and anything user-facing that doesn't need transactional consistency to a read replica. Cuts primary load by 40–70% in most apps.
2. Partition hot tables
Time-series tables (events, audits, logs) partition cleanly by month. Postgres native partitioning is fast and stable. Dropping a partition is instant and metadata-only—much faster than DELETE FROM.
3. Move cold data out
Anything older than 90 days that's read once a month belongs in S3 + Athena, not in your transactional database. The pattern: hot data in Postgres, warm in a separate analytics DB, cold in S3.
4. Connection pooling
RDS Proxy or PgBouncer. Connections cost more than queries in Postgres. We've fixed several 'database is dying' incidents by adding a pooler in front of an otherwise healthy database.
When you actually need to shard
When write throughput exceeds what a single primary can do. When the working set exceeds RAM and you can't buy more. When tenant boundaries make natural shard keys.
Citus (or its Azure flavor) gives you distributed Postgres without rewriting your app. AWS Aurora Limitless is the newer entrant. Both work; both are easier than rolling your own.
The architectural prep that pays off
- Always include tenant_id in queries on multi-tenant tables, even when you don't need it. Future-you needs a shard key.
- Don't use SERIAL primary keys for anything that might cross shards later. Use UUIDs or Snowflake-style IDs.
- Keep cross-tenant joins out of hot paths.