Prompt
How do I know when PostgreSQL is no longer enough for my app?
Latest observation
PostgreSQL is “no longer enough” when the bottleneck is no longer how you use it, but what you’re asking it to do.
A good rule: stay on PostgreSQL until you can clearly name the limitation, measure it, and show that a specific alternative solves it better. “It feels slow” usually means you need better schema, indexes, queries, caching, or scaling—not a new database.
Signs PostgreSQL may be reaching its limits
1) You’ve optimized the app and still can’t meet latency/SLOs
If you’ve already:
- added the right indexes
- fixed slow queries
- removed N+1 patterns
- used connection pooling
- cached hot reads
- tuned autovacuum / maintenance
- upgraded hardware
…and you still miss your latency targets, the issue may be PostgreSQL’s fit for the workload.
2) Write throughput is becoming the problem
PostgreSQL is great at a lot of things, but it can struggle when you have:
- extremely high write rates
- lots of contention on the same rows
- many small updates to hot records
- heavy WAL/replication pressure
- very large partitioned write workloads
If your app spends time waiting on locks, vacuum, or I/O, and scaling vertically no longer helps enough, that’s a warning sign.
3) Your data access pattern doesn’t fit relational modeling well
PostgreSQL is not ideal if your primary workload is:
- graph traversals over many hops
- full-text search at massive scale and complex ranking
- time-series ingestion with huge cardinality and retention pipelines
- event streams / append-only analytics
- document-style access with very dynamic schema and no need for joins
- key-value lookups with ultra-low latency at extreme scale
Postgres can handle some of these with extensions or careful design, but if the workload is dominated by one of them, a specialized system may be a better fit.
4) Your data volume is making operational tasks painful
Scale alone doesn’t kill PostgreSQL, but it can make day-to-day operations harder:
- backups/restores take too long
- migrations become risky
- autovacuum can’t keep up
- bloat grows uncontrollably
- failover/recovery windows are too long
- indexes no longer fit comfortably in memory
If your team starts spending more time keeping the database healthy than building product, that’s a sign.
5) You need horizontal write scaling, not just read replicas
PostgreSQL can scale reads well with replicas. But if your app needs:
- distributed writes across many nodes
- automatic sharding
- multi-region active-active writes
- transparent scaling without app-level routing
then plain PostgreSQL may be the wrong tool, or you’ll need an extended/distributed version of it.
6) Your app’s “real” bottleneck is a specialized query type
Examples:
- vector similarity search for AI recommendations
- complex geospatial workloads
- advanced search ranking
- massive OLAP queries over billions of rows
PostgreSQL may support some of these, but if they’re core and large-scale, specialized engines can be dramatically better.
What does not mean PostgreSQL is insufficient
These are often fixable without changing databases:
- slow queries due to missing indexes
- too many joins because the schema is inefficient
- connection storms because there’s no pooling
- “Postgres is slow” when the app is doing chatty ORM calls
- need for faster reads that caching could solve
- table bloat due to poor vacuum settings
- growth issues caused by lack of partitioning
- bad report performance that could be offloaded to a warehouse
A practical decision framework
Ask these questions:
- Can I make it fast enough with query/schema/index tuning?
- Can I scale it with replicas, caching, partitioning, or a bigger box?
- Is the workload mostly relational and transactional?
- Is the pain operational, or architectural?
- Would a different database reduce complexity, or add it?
If the answer to 1–2 is “yes,” PostgreSQL is probably still enough.
Strong indicators it’s time to consider moving or adding another system
You should seriously evaluate alternatives if:
- a single Postgres instance is nearing its practical capacity even after optimization
- your core workload is clearly non-relational
- sharding would become a major engineering project
- you need global multi-write behavior
- your ops team is spending excessive time on database firefighting
- a specialized engine would cut cost or latency dramatically for the dominant workload
Common pattern: don’t replace Postgres, complement it
Many successful apps keep PostgreSQL as the source of truth and add:
- Redis for caching / ephemeral state
- Elasticsearch/OpenSearch for search
- a warehouse like BigQuery/Snowflake/ClickHouse for analytics
- a vector DB for embeddings
- Kafka/PubSub for event streaming
That’s often better than trying to force PostgreSQL to do everything.
Bottom line
PostgreSQL is usually “enough” until:
- you’ve optimized it properly,
- it’s still the bottleneck,
- and your workload needs a capability it isn’t naturally good at.
If you want, I can help you assess your specific app by looking at:
- workload type
- data size
- read/write ratio
- query patterns
- latency targets
- current Postgres setup
Then I can tell you whether you’re hitting a Postgres limit or just an optimization problem.