Bird
Raised Fist0
PostgreSQLquery~5 mins

pg_stat_statements for slow queries in PostgreSQL - Cheat Sheet & Quick Revision

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is pg_stat_statements in PostgreSQL?

pg_stat_statements is an extension that tracks execution statistics of all SQL statements executed by a server. It helps identify slow or expensive queries.

Click to reveal answer
beginner
How do you enable pg_stat_statements in PostgreSQL?

To enable, add pg_stat_statements to shared_preload_libraries in postgresql.conf and restart the server. Then run CREATE EXTENSION pg_stat_statements; in your database.

Click to reveal answer
beginner
Which view do you query to find slow queries using pg_stat_statements?

You query the pg_stat_statements view. It shows aggregated stats like total time, calls, and average time per query.

Click to reveal answer
intermediate
What SQL query helps find the top 5 slowest queries by average execution time using pg_stat_statements?
SELECT query, calls, total_time, mean_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 5;
Click to reveal answer
intermediate
Why is it useful to look at mean_time instead of total_time when analyzing slow queries?

mean_time shows the average time per execution, helping identify queries that are slow individually, even if they run fewer times. total_time can be high for frequently run fast queries.

Click to reveal answer
What must you do first to use pg_stat_statements in PostgreSQL?
ARun <code>VACUUM</code> on all tables
BCreate a new database
CAdd it to <code>shared_preload_libraries</code> and restart the server
DInstall a third-party tool
Which column in pg_stat_statements shows the average execution time of a query?
Amean_time
Btotal_time
Ccalls
Drows
How can you find the slowest queries using pg_stat_statements?
AOrder by <code>calls</code> descending
BOrder by <code>mean_time</code> descending
COrder by <code>rows</code> ascending
DOrder by <code>queryid</code>
What does the calls column represent in pg_stat_statements?
AQuery text length
BNumber of rows returned
CTotal execution time in milliseconds
DNumber of times the query was executed
Why might a query with high total_time not be slow individually?
AIt runs many times but each execution is fast
BIt returns many rows
CIt has a long query text
DIt uses indexes
Explain how to set up and use pg_stat_statements to find slow queries in PostgreSQL.
Think about configuration, extension creation, and querying statistics.
You got /5 concepts.
    Describe why mean_time is more useful than total_time when analyzing slow queries with pg_stat_statements.
    Consider the difference between average and total values.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the primary purpose of the pg_stat_statements extension in PostgreSQL?
      easy
      A. To manage user permissions and roles
      B. To backup the database automatically
      C. To optimize disk storage usage
      D. To track and report query execution statistics including slow queries

      Solution

      1. Step 1: Understand the role of pg_stat_statements

        The extension collects statistics about query execution times and counts, helping identify slow queries.
      2. Step 2: Compare with other options

        Options A, B, and D describe unrelated database functions like backup, permissions, and storage optimization.
      3. Final Answer:

        To track and report query execution statistics including slow queries -> Option D
      4. Quick Check:

        pg_stat_statements = track slow queries [OK]
      Hint: Remember: pg_stat_statements tracks query performance stats [OK]
      Common Mistakes:
      • Confusing pg_stat_statements with backup tools
      • Thinking it manages user roles
      • Assuming it optimizes disk space
      2. Which SQL command correctly enables the pg_stat_statements extension in PostgreSQL?
      easy
      A. CREATE EXTENSION pg_stat_statements;
      B. ENABLE EXTENSION pg_stat_statements;
      C. LOAD EXTENSION pg_stat_statements;
      D. START EXTENSION pg_stat_statements;

      Solution

      1. Step 1: Recall the syntax to enable extensions

        PostgreSQL uses CREATE EXTENSION extension_name; to enable extensions.
      2. Step 2: Check other options

        Commands like ENABLE, LOAD, or START are not valid for enabling extensions in PostgreSQL.
      3. Final Answer:

        CREATE EXTENSION pg_stat_statements; -> Option A
      4. Quick Check:

        Enable extension = CREATE EXTENSION [OK]
      Hint: Use CREATE EXTENSION to enable PostgreSQL extensions [OK]
      Common Mistakes:
      • Using ENABLE or LOAD instead of CREATE EXTENSION
      • Forgetting the semicolon at the end
      • Trying to enable without superuser rights
      3. Given the query:
      SELECT query, total_time, calls FROM pg_stat_statements ORDER BY total_time DESC LIMIT 1;

      What does this query return?
      medium
      A. The query with the fewest calls
      B. The most recent query executed
      C. The query with the highest total execution time and its stats
      D. All queries sorted by average time

      Solution

      1. Step 1: Analyze the ORDER BY clause

        The query orders results by total_time in descending order, so the highest total execution time is first.
      2. Step 2: Understand the LIMIT 1

        LIMIT 1 returns only the top row, which is the slowest query by total execution time.
      3. Final Answer:

        The query with the highest total execution time and its stats -> Option C
      4. Quick Check:

        ORDER BY total_time DESC LIMIT 1 = slowest query [OK]
      Hint: ORDER BY total_time DESC LIMIT 1 shows slowest query [OK]
      Common Mistakes:
      • Thinking it returns the most recent query
      • Confusing total_time with average time
      • Assuming it returns all queries
      4. You run this query:
      SELECT * FROM pg_stat_statements WHERE query = 'SELECT * FROM users';

      But it returns no rows. What could be the problem?
      medium
      A. The exact query text does not match due to whitespace or formatting differences
      B. pg_stat_statements is disabled and not collecting data
      C. The users table does not exist
      D. The query is too fast to be recorded

      Solution

      1. Step 1: Understand how pg_stat_statements stores queries

        It stores normalized query texts, so exact string matches may fail if whitespace or formatting differs.
      2. Step 2: Consider other options

        While B is possible, the question implies pg_stat_statements is enabled. C and D do not explain no rows for that query text.
      3. Final Answer:

        The exact query text does not match due to whitespace or formatting differences -> Option A
      4. Quick Check:

        Exact query text match may fail due to formatting [OK]
      Hint: Query text must match exactly including spaces [OK]
      Common Mistakes:
      • Assuming any query text matches regardless of formatting
      • Ignoring that extension might be disabled
      • Thinking table existence affects pg_stat_statements output
      5. You want to reset all collected statistics in pg_stat_statements to start fresh after fixing slow queries. Which command should you run?
      hard
      A. TRUNCATE pg_stat_statements;
      B. SELECT pg_stat_statements_reset();
      C. DROP EXTENSION pg_stat_statements;
      D. RESET pg_stat_statements;

      Solution

      1. Step 1: Identify the correct function to reset stats

        PostgreSQL provides the function pg_stat_statements_reset() to clear collected statistics.
      2. Step 2: Evaluate other options

        RESET is not valid syntax here, DROP EXTENSION removes the extension, and TRUNCATE is not allowed on this view.
      3. Final Answer:

        SELECT pg_stat_statements_reset(); -> Option B
      4. Quick Check:

        Reset stats = pg_stat_statements_reset() function [OK]
      Hint: Use SELECT pg_stat_statements_reset() to clear stats [OK]
      Common Mistakes:
      • Trying to DROP the extension to reset stats
      • Using RESET command incorrectly
      • Attempting to TRUNCATE the stats view