pganalyze Blog
DBAs and developers use pganalyze to identify the root cause of performance issues, optimize queries and to get alerts about critical issues. Sign up for free!
- Posts
- 200 from 20 Mar 2014 to 15 Oct 2026
- Posting
- monthly (19 in the last year)
- Kind
- company blog
- Feed
- https://pganalyze.com/feed.xml
2026 18
- Safely enable AI Coding Tools to use EXPLAIN ANALYZE on production: Introducing Workbooks in the pganalyze MCP Server
- Postgres Monitoring for SQL Server DBAs: Statistics and Logs 101
- Postgres in Production Special Series: How to Query pg_stat_statements to Find Slow and Expensive Postgres Queries (Part 7)
- Postgres in Production Special Series: Diagnosing High Cardinality Workloads in pg_stat_statements (Part 6)
- Find and fix slow Postgres queries on Supabase and Neon with pganalyze
- New Query Advisor Insights: Inefficient Index Use, work_mem tuning, and OR to UNION rewrite
- Postgres in Production Special Series: Configuring pg_stat_statements to Reduce Deallocations (Part 5)
- Postgres in Production Special Series: How pg_stat_statements Decides What to Keep (Part 4)
- Postgres in Production Special Series: Where Your Query Text Actually Lives (Part 3)
- New in pganalyze: Server Groups and Cluster-Wide Query Performance
- Postgres in Production Special Series: What Makes a Statement Unique (Part 2)
- pganalyze MCP Server is now in Public Preview
- Postgres in Production Special Series: What pg_stat_statements Is and Isn't (Part 1)
- Waiting for Postgres 19: Reduced timing overhead for EXPLAIN ANALYZE with RDTSC
- The Dilemma of the ‘AI DBA’
- Waiting for Postgres 19: Better Planner Hints with Path Generation Strategies
- pganalyze Index Advisor is Now Cluster-Aware
- Extended 100 day retention in pganalyze, and the new storage format that made it work
2025 9
- Continue reading→
- How we used pg_query to rewrite queries to fix bad query plans
- Introducing pganalyze Query Advisor: Proactive Query Plan Optimization for Postgres
- Waiting for Postgres 18: Accelerating Disk Reads with Asynchronous I/O
- Postgres vs. SQL Server: B-Tree Index Differences & the Benefit of Deduplication
- How Notion Runs PostgreSQL at Scale on Amazon RDS with pganalyze
- Comparing EXPLAIN Plans is hard (and how pganalyze does it)
- Replacing Oracle Hints: Best Practices with pg_hint_plan on PostgreSQL
- Introducing Query Tuning Workbooks: Safely Tune Postgres Queries on Production with pganalyze
2024 30
- Tracking Postgres Buffer Cache Statistics over time with pganalyze
- Introducing Postgres Plan Statistics in pganalyze for Amazon Aurora
- Postgres Planner Quirks: Incremental Sort, and when it goes wrong
- Constraint Programming in Action: Optimizing Postgres Index Selection
- A practical introduction to Constraint Programming using CP-SAT and Python
- The surprising logic of the Postgres work_mem setting, and how to tune it
- Waiting for Postgres 17: Better Query Plans for Materialized CTE Scans
- Postgres Planner Quirks: JOIN Equivalence Classes and IN/ANY filters
- What's (not) in Postgres 17 beta1, and how to test it
- Postgres Planner Quirks: How to fix bad JSONB selectivity estimates
- Postgres CVE-2024-4317 and how to fix the system views
- Postgres Planner Quirks: The impact of ORDER BY + LIMIT on index usage
- Waiting for Postgres 17: Streaming I/O for sequential scans & ANALYZE
- Waiting for Postgres 17: Faster B-Tree Index Scans for IN(...) lists and ANY =
- Waiting for Postgres 17: Benchmarking with pg_buffercache_evict
- Waiting for Postgres 17: Faster VACUUM with Adaptive Radix Trees
- Waiting for Postgres 17: Improved EXPLAIN for SubPlan nodes
- Waiting for Postgres 17: The new built-in C.UTF-8 locale
- How Figma built DBProxy for sharding Postgres
- Tuning random_page_cost and how index correlation affects query plans
- Waiting for Postgres 17: Configurable SLRU cache sizes for increased performance
- Introducing pganalyze Index Advisor 3.0 - A workload-aware system for finding missing indexes in Postgres
- Speeding up partial COUNT(*) in Postgres by using LIMIT in a subquery
- Out of range planner statistics and "get_actual_variable_range" in Postgres
- Faster query plans with Postgres 16: Incremental Sorts, Anti-JOINs and more
- Reducing table size with optimal column ordering and array-based storage
- Finding the root cause of locking problems in Postgres
- How to partition Postgres tables by timestamp based UUIDs
- The different trade-offs of Distributed Postgres architectures
- Introducing pg_query for Postgres 16 - Parsing SQL/JSON, Windows support, PL/pgSQL parse mode & more
2023 50
- Waiting for Postgres 17: Incremental base backups
- Zero downtime Postgres upgrades and how to logically replicate very large tables
- The un-fun work of making Postgres FIPS compliant
- Exploring Postgres VACUUM with the VACUUM Simulator
- Avoiding deadlocks in Postgres migrations
- How to use CREATE STATISTICS to improve a plan rows estimate, and why it matters
- GitLab's challenge with Postgres LWLock lock_manager contention
- The pg_stat_checkpointer view in Postgres 17
- Performance implications of medium size values and TOAST in Postgres and how to mitigate them
- PgBouncer 1.21 adds prepared statement support in transaction mode
- What the new Rails 7.1 brings for Postgres users
- HOT Updates and BRIN indexes in Postgres 16
- Postgres I/O Basics, and how to efficiently pack table pages
- 4 improvements in Postgres 16 that you might not know about yet
- EXPLAIN (ANALYZE, BUFFERS) and interpreting shared buffers hit in Nested Loops
- Postgres 16 is released!
- How partition-wise joins and aggregates improve query performance
- Optimizing bulk loads in Postgres, and how COPY helps with cache performance
- Handling outliers in BRIN indexes with the new multi minmax operator class
- Partitioning in Postgres and the risk of high partition counts
- Introducing pganalyze VACUUM Advisor: Workload-aware autovacuum tuning for Postgres
- How Table Access Methods in Postgres may offer a future without Bloat
- How to optimize correlated subqueries in Postgres
- Postgres performance with IN vs ANY
- Storing and querying vector data in Postgres with pgvector
- Speed up Postgres with transaction pooling with prepared statements
- How to use HOT Updates in Postgres to make CLUSTER work better
- How Figma and Notion scaled Postgres
- How bulk loading with COPY can be 300% times faster in Postgres 16 Beta 1
- Tuning huge pages in Postgres
- A Postmortem on High Memory Usage with Prepared Statements
- Forcing Join Order in Postgres Using Optimization Barriers
- Postgres 16: Logical decoding on standbys
- Postgres 16: Running EXPLAIN on any query (even with $1 parameters!)
- Postgres 16: Buffer cache hit ratio and I/O times in pg_stat_io
- Continue reading→
- PL/Rust 1.0 and its trusted language mode
- Collations in Postgres
- Postgres connection pooling: Comparing PgCat and pgbouncer
- UUIDs vs Serial for Primary Keys - what's the right choice?
- Handling integer sequence overflow without downtime in Postgres
- How Postgres DBAs can use pg_stat_io
- Unlogged tables in Postgres: Is their data truly gone after a crash?
- Avoid Postgres performance cliffs with MultiXact IDs and foreign keys
- Postgres 16: Cumulative I/O statistics with pg_stat_io
- Never run VACUUM FULL: How to run pg_repack on Amazon RDS and Aurora
- Tracing Locks in Postgres using eBPF programs
- Postgres 16: Surviving without a superuser & reserved_connections
- Using Memoize to speed up joins between two Postgres tables
- Using pgbench to load data faster, and the random_normal function in PG16
2022 56
- Speed up Postgres queries with UNIONs and subquery pull-up
- Benchmarking multi-column, covering and hash indexes in Postgres
- Roaring Bitmaps and pgfaceting: Fast counting across large datasets in Postgres
- Lock monitoring in Postgres: Find blocking queries in a lock tree with pganalyze
- Creating custom extensions on Amazon RDS and Aurora with pg_tle
- PostgreSQL ANY vs IN lists: Bind parameters and performance
- 5mins of Postgres E44: Reducing replication lag with maintenance_io_concurrency in Postgres 15
- 5mins of Postgres E43: Logical replication in Postgres 15 & why the REPLICA IDENTITY matters
- 5mins of Postgres E42: A surprising case of very large integers causing a Sequential Scan
- 5mins of Postgres E41: Tuning shared_buffers for OLTP and data warehouse workloads & is 25% of RAM a good choice?
- 5mins of Postgres E40: How to debug slow Postgres UPDATEs and bloated tables with auto_explain & page_inspect
- 5mins of Postgres E39: Postgres 15 release, and 6 tips for managing indexes
- 5mins of Postgres E38: When to use BRIN indexes in Postgres, tuning pages_per_range and determining correlation with pg_stats
- 5mins of Postgres E37: New in Postgres 15: Logical replication column filters & database-wide ICU collations
- 5mins of Postgres E36: Optimizing Postgres query throughput in Python using pipeline mode and psycopg 3.1
- 5mins of Postgres E35: How to run EXPLAIN on normalized queries from pg_stat_statements using plan_cache_mode
- 5mins of Postgres E34: Making the most of Parallel VACUUM and why SQL/JSON was pushed out to Postgres 16
- 5mins of Postgres E33: Postgres on Kubernetes, choosing the right operator, and handling major version upgrades
- 5mins of Postgres E32: Benchmarking and improving query network latency using tc, COPY and pipeline mode
- 5mins of Postgres E31: Postgres security patch release, spotting vulnerable extensions and securing the public schema
- 5mins of Postgres E30: Postgres performance puzzle, Linux readahead and tuning effective_io_concurrency
- 5mins of Postgres E29: Postgres lock conflicts on Amazon Aurora & tuning max_standby_streaming_delay and hot_standby_feedback
- 5mins of Postgres E28: Row Level Security in Postgres, security invoker views and why LEAKPROOF functions matter
- 5mins of Postgres E27: Postgres 16 - Make subquery alias optional in FROM clause
- 5mins of Postgres E26: New in Postgres 15 - NULL handling in UNIQUE constraints & Parallel DISTINCT
- 5mins of Postgres E25: Postgres lock monitoring, LWLocks and the log_lock_waits setting
- 5mins of Postgres E24: Tuning the Postgres statistics target & understanding selectivity for spatial indexes
- 5mins of Postgres E23: Fuzzy text search & case-insensitive ICU collations in Postgres
- 5mins of Postgres E22: Reducing AWS Aurora I/O costs with table partitioning & understanding partition pruning
- 5mins of Postgres E21: Server-side backup compression with LZ4 and Zstandard in Postgres 15, and the removal of exclusive backup mode
- 5mins of Postgres E20: An important bug in Postgres 14 with REINDEX / CREATE INDEX CONCURRENTLY, and using the amcheck extension
- A balanced approach to automatic Postgres indexing: The new version of the pganalyze Index Advisor
- An automatic indexing system for Postgres: How we built the pganalyze Indexing Engine
- 5mins of Postgres E19: Speeding up sort performance in Postgres 15
- Design at pganalyze: How we use design principles to develop new features and products
- 5mins of Postgres E18: Partition pruning, prepared statements and generic vs custom query plans
- 5mins of Postgres E17: Demystifying Postgres for application developers: A mental model for tables and indexes
- 5mins of Postgres E16: Incremental Materialized Views with pg_ivm and Looking Ahead to Postgres 15 Beta 1
- The Unexpected Find That Freed 20GB of Unused Index Space
- 5mins of Postgres E15: Tuning Postgres' Deterministic Query Planner, Extended Statistics and Join Collapse Limits
- 5mins of Postgres E14: HOT Updates vs Bottom-Up Index Deletion in Postgres 14
- 5mins of Postgres E13: New SQL/JSON and JSON_TABLE features in Postgres 15
- 5mins of Postgres E12: The basics of tuning VACUUM and autovacuum
- How Postgres Chooses Which Index To Use For A Query
- Postgres INSERT ON CONFLICT and how it compares to MERGE in Postgres 15
- 5mins of Postgres E10: max_wal_size, Postgres full page writes and UUID vs BIGINT primary keys
- 5mins of Postgres E9: PostGIS vs GPUs, tuning parallel queries, and automating Citus extension benchmarks with HammerDB
- 5mins of Postgres E8: Postgres Auditing: Table triggers with supabase vs the pgAudit extension
- 5mins of Postgres E7: Autovacuum, dead tuples not yet removable, and the Postgres xmin horizon
- 5mins of Postgres E6: Optimizing Postgres Text Search with Trigrams and GiST indexes
- 5mins of Postgres E5: Finding the root cause of high CPU utilization in Postgres with EXPLAIN and the Linux perf command
- 5mins of Postgres E4: Writing your own custom Postgres aggregates with Rust or raw SQL
- 5mins of Postgres E3: Postgres performance cliffs with large JSONB values and TOAST
- 5mins of Postgres E2: Using unnest(..), generate_series(), and PostGIS
- 5mins of Postgres E1: Using Postgres statistics to improve bad query plans, pg_hint_plan extension
- Postgres in 2021: An Observer's Year In Review
2021 14
- The Fastest Way To Load Data Into Postgres With Ruby on Rails
- Understanding Postgres GIN Indexes: The Good and the Bad
- Postgres Views in Django
- How we deconstructed the Postgres planner to find indexing opportunities
- A better way to index your Postgres database: pganalyze Index Advisor
- Using Postgres CREATE INDEX: Understanding operator classes, index types & more
- Efficient Pagination: PostgreSQL and Django
- PostgreSQL Partitioning in Django
- GeoDjango and PostGIS in Django
- Using Postgres Row-Level Security in Ruby on Rails
- A look at Postgres 14: Performance and Monitoring Improvements
- Creating Custom Postgres Data Types in Rails
- Introducing pg_query 2.0: The easiest way to parse Postgres queries
- Efficient Postgres Full Text Search in Django
2020 10
- Creating Custom Postgres Data Types in Django
- PostGIS vs. Geocoder in Rails
- Lessons Learned from Running Postgres 13: Better Performance, Monitoring & More
- Using Postgres Row-Level Security in Python and Django
- Postgres JSONB Fields in Django
- Building SVG Components in React
- Advanced Active Record: Using Subqueries in Rails
- Introducing New Charts & Date Picker in pganalyze
- Full Text Search in Milliseconds with Rails and PostgreSQL
- Effectively Using Materialized Views in Ruby on Rails