Optimizing PostgreSQL: A Guide to Troubleshooting Long-Running Queries and Wait Events

Troubleshooting long-running queries in PostgreSQL and identifying wait events, along with insights into application and session operations, involves several steps. This process helps in pinpointing the root cause of performance issues and in formulating appropriate solutions. Here’s a structured approach:

1. Identify Long-Running Queries

First, identify the long-running queries using the pg_stat_activity view. This view shows all active queries and their run times:

This gives you a list of active queries ordered by their execution time, allowing you to focus on the longest-running ones.

2. Analyze Wait Events

Wait events in the pg_stat_activity view can indicate what the query is waiting on, such as locks, IO, etc.:

  • Lock waits: If wait_event_type is Lock, the query is waiting for a lock. You can then investigate which table or row is causing the lock wait.
  • IO waits: IO-related waits can be identified by wait events like DataFileRead or DataFileWrite, suggesting the query is slowed down by disk IO.

3. Investigate Blocking Queries

For lock-related wait events, identify blocking sessions:

This query helps in identifying which queries are blocking others, a common cause of long-running queries.

4. Dive Into Application Logs

Application logs can provide context for long-running queries, such as which operations triggered them and any errors or warnings that were logged. This is crucial for understanding the application behavior that leads to problematic queries.

5. Utilize EXPLAIN Plans

For identified long-running queries, use the EXPLAIN and EXPLAIN ANALYZE commands to get the execution plan and runtime statistics:

This helps in understanding how PostgreSQL executes the query, which parts of the query are most time-consuming, and whether the query planner’s assumptions match reality.

6. Monitor Session Activity

Monitoring the number and types of active sessions can offer insights into overall system load and specific user or application behaviors contributing to performance issues. Use pg_stat_activity to monitor sessions, and consider using tools or extensions that provide more detailed monitoring and historical data.

7. Apply Index and Query Optimization

Based on the insights gathered, consider applying optimizations such as:

  • Creating or modifying indexes to improve query performance.
  • Optimizing query structure, such as splitting complex queries into simpler parts or rewriting queries to allow for better execution plans.
  • Adjusting database configuration settings to better suit your workload, based on the identified bottlenecks.

8. Review Database Configuration

Review and adjust PostgreSQL configuration settings related to memory usage, parallelism, and IO, based on the performance analysis. Tools like pgtune can provide a good starting point for configuration adjustments.

9. Implement Application Changes

Based on application log analysis and query behavior, implement necessary changes in the application to prevent long-running queries. This might include optimizing data access patterns, caching, or modifying how data is queried and processed.


Troubleshooting long-running queries in PostgreSQL involves a comprehensive approach that combines database insights with application context. Identifying wait events and analyzing execution plans are key steps in diagnosing the issue. Additionally, understanding the application behavior and session activity provides a complete picture necessary for effective optimization and performance improvement.

About Shiv Iyer 444 Articles
Open Source Database Systems Engineer with a deep understanding of Optimizer Internals, Performance Engineering, Scalability and Data SRE. Shiv currently is the Founder, Investor, Board Member and CEO of multiple Database Systems Infrastructure Operations companies in the Transaction Processing Computing and ColumnStores ecosystem. He is also a frequent speaker in open source software conferences globally.