Skip to main content

Database Tuning

In order to diagnose Postgres SQL queries

Enter docker container: docker exec -ti cardano-rosetta-java-db-1 /bin/bash

Connect to psql inside of docker container: PGPASSWORD=weakpwd#123_d psql -h localhost -p 5432 -d rosetta-java -U rosetta_db_admin

Postgres SQL Performance Monitoring Options

Yes! You can monitor all queries in PostgreSQL and check whether they are using indexes using pg_stat_statements, logging, and EXPLAIN tools.


1. Use pg_stat_statements (Best for Monitoring)​

PostgreSQL provides a built-in extension pg_stat_statements that tracks query performance, including index usage.

Enable pg_stat_statements​

  1. Edit postgresql.conf (inside your container):
    shared_preload_libraries = 'pg_stat_statements'
    track_activity_query_size = 2048
  2. Restart PostgreSQL:
    docker restart <postgres_container_name>
  3. Run inside psql:
    CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

Query to Check Queries Using Indexes​

SELECT query, calls, total_exec_time, rows, shared_blks_hit, shared_blks_read
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;
  • shared_blks_hit > shared_blks_read → More index usage.
  • If shared_blks_read is high, queries are scanning more blocks, possibly missing indexes.

2. Log Queries That Don't Use Indexes​

If you want to log queries that perform sequential scans, enable logging.

Edit postgresql.conf​

log_min_duration_statement = 500  # Log queries taking more than 500ms
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
log_statement = 'all'
log_temp_files = 0
log_autovacuum_min_duration = 0

Then restart PostgreSQL.

Filter Queries Using Sequential Scan​

Once logging is enabled, find queries not using indexes:

cat /var/lib/postgresql/data/log/postgresql.log | grep 'Seq Scan'

If many queries are using Seq Scan, they are not hitting indexes.


3. Use EXPLAIN (ANALYZE, BUFFERS) Automatically​

To analyze all queries dynamically:

CREATE OR REPLACE FUNCTION log_explain() RETURNS event_trigger AS $$
BEGIN
RAISE NOTICE '%', (SELECT json_agg(row_to_json(t))
FROM (
SELECT query, json_agg(row_to_json(p)) AS plan
FROM pg_stat_statements p, LATERAL (EXPLAIN (ANALYZE, BUFFERS) p.query) q
) t);
END;
$$ LANGUAGE plpgsql;

Then attach it to queries.


4. Use auto_explain (Automatic Logging of Query Plans)​

This extension logs execution plans automatically.

Enable auto_explain​

  1. Edit postgresql.conf:
    shared_preload_libraries = 'auto_explain'
    auto_explain.log_min_duration = 500 # Log queries taking more than 500ms
    auto_explain.log_analyze = true
    auto_explain.log_buffers = true
    auto_explain.log_nested_statements = true
  2. Restart PostgreSQL:
    docker restart <postgres_container_name>
  3. Run in psql:
    LOAD 'auto_explain';

Now, PostgreSQL will log all slow queries with EXPLAIN ANALYZE, allowing you to detect if indexes are used.


5. Third-Party Monitoring Tools​

If you want a UI-based approach, tools like pgAdmin, pganalyze, or pgwatch2 can track index usage visually.


Final Thoughts​

For real-time monitoring, use pg_stat_statements.
For logging slow queries, enable auto_explain.
For detailed analysis, filter logs for Seq Scan.