PostgreSQL Logo

One of the most powerful tools in a PostgreSQL database is indexing. It can significantly improve query performance, but how do you know if the indexes are doing their job?

PostgreSQL provides a handy system view called pg_stat_user_indexes that allows you to keep an eye on index usage.

    indexrelname AS index_name,
    idx_scan AS total_scans,
    idx_tup_read AS total_tuples_read,
    idx_tup_fetch AS total_tuples_fetched
    relname = 'example_table';

Here’s what each part of this query does:

  • indexrelname: This column gives you the name of the index.
  • idx_scan: It shows how many times the index has been scanned. A high number means the index is actively used.
  • idx_tup_read: This is the total number of index entries read during scans. It indicates the workload on the index.
  • idx_tup_fetch: The total number of table rows fetched by the index scans. This shows how efficiently the index is retrieving data.

Why Monitor Index Usage?

Indexed are like the table of contents in a book. they help the database quickly locate the rows you need for your queries. However, not all indexes are equally efficient, and some might not be used at all. Monitoring index usage is crucial for:

  • Having too many indexes on a particular table can negatively impact its write and update performance.
  • Identifying underutilized or unused indexes allows us to optimize write and update performance.
  • Eliminating unnecessary indexes to save storage space.
  • Ensuring that your most critical queries are performing optimally.


Optimizing your PostgreSQL database involves more than just creating indexes; it’s about ensuring that those indexes are doing their job efficiently. By regularly monitoring index usage using the simple SQL query provided, you can maintain a lean and high-performing database that serves your application’s needs effectively.