Dive into Postgres stats: pg_stat_all_tables - Data Egret (2023)

Everything you ever wanted to know about Postgres statistics

Today's post is aboutpg_stat_all_tables. This view contains various statistics about the usage of the table and can be useful in various scenarios. I will talk about the following:

  1. Sequential scans.
  2. Table writing activity.
  3. An empty queue.

Sequential scans.One of the most useful types of information you can get by checking pg_stat_all_tables is the number of scans. Shows how many times tables were accessed directly or through indexes and how many rows were returned from those scans; this information is inseq_scan/seq_tup_readmiidx_scan/idx_tup_fetchcolumns.

We need the first two columns that indicate the number of times the tables were accessed via sequential scans and the number of tuples returned as a result.

Why use sequential scanning? It is not a problem when seqscan processes small tables, but in case of larger tables, the sequential scan can read the entire table and this can take a while. It also becomes a problem when Postgres processes many sequential scans at the same time and memory performance drops significantly. Usually it's a missing index for new types of queries, inaccurate statistics used by the query scheduler, or just a forgotten LIMIT clause in the query. However, pg_stat_all_tables allows you to quickly check if there are sequential checks on systems. With the mentioned columns we can write very simple queries and get the correct information:


(Video) Scaling Postgres Episode 136 Stat Tracking | Temporary Tables | pg_squeeze | pg_auto_failover

schema name, rename,

seq_scan, seq_tup_read,

seq_tup_read / seq_scan como avg_seq_tup_read

FROM pg_stat_all_tables

DONDE seq_scan > 0

(Video) PostgreSQL Logical Replication Guide


Schema Name | Relationship name | seq_scan | seq_tup_read | avg_seq_tup_read--------------+------------------------+---------- + - --------------+-----------------public | Offers | 621 | 81712449358 | 131582044public | customer_balance | 26 | 574164012 | 22083231public | events_by_date_summary | 2698 | 57342287963 | 21253627public | Client_Summary | 5924 | 91655173288 | 15471838public | Advertising Statistics | 505 | 5055606286 | 10011101

In this query, we use manually calculated calculationsavg_seq_tup_read, is an average number of rows returned from a scan. Be careful with tables and queries when the average number of rows exceeds millions of rows per scan. You can also addpg_size_ratio()Function to get an idea of ​​the size of the tables and a rough estimate of the amount of data that will be read in each scan.

Therefore, if you encounter tables that are accessed sequentially, remember which queries use those tables, examine them, and try to fix the causes of the checks.

Table writing activity.Table input/output in Postgres is not an easy process, especially write operations. The INSERT and DELETE commands are simpler than UPDATE because they don't change the destination rows; the UPDATE command inserts new versions of rows and marks older versions as deleted. If the indices are referenced on the updated rows, similar changes will be made to the indices. Therefore, the update operations are not as simple as it might seem. In other words, Postgres doesn't like a heavy, update-intensive workload. Several improvements have been made to reduce the overhead caused by write operations, the best known being HOT (Nur-Heap-Tupel) updates introduced in 8.3.

In short, it allows index entries to remain unchanged when updating non-indexed values ​​within rows. However, this only works if there is free space (or space marked for reuse) on the page where the target rows reside; HOT updates won't work if the page is completely filled with the rows.

(Video) PostgreSQL In-Depth Training: Performance Part 1

What about pg_stat_all_tables? Using this view, we can estimate the HOT update ratio for the most up-to-date tables. Each table in this view hasn_tup_updmin_tup_hot_updColumns corresponding to the total number of regular and HOT updates for specific tables. So the task is to find the tables with the highest write activity and calculate their HOT rate. A sample query can be foundHere.

What's next? Tables with high HOT rate are the "good" tables, we need to pay attention to tables with high write count and low or no HOT rate. The general rule for these is to changefill factorSettings: Allow to reserve free space when inserting new rows and expanding the table. The placeholder ensures that the lines within the page will update and there is a high probability that a HOT update will occur. The fill factor setting can be changed quickly with the ALTER TABLE command, and a good starting point for this is 70 or 80. Also, you need to know a few rules to work correctly with the fill factor.

  • First, after the fill factor changes, your worksheet will take up more disk space.
  • Second, the fill factor only applies to newly allocated pages, and if you want a new fill factor for all pages in the table, you have to recreate the table, which can be quite a pain (hello VACUUM FULL).
  • The third and last one is that fillfactor is only useful in cases of queries that update non-indexed values, otherwise it has no positive effect.

An empty queue.Autovacuum is the really important feature in Postgres that allows you to keep tables and indexes intact: it cleans up dead versions, so in case of an ineffective autovacuum, tables and indexes bloat, causing performance to suffer permanently. The number of automatic vacuum cleaners operating at the same time is limited byautovacuum_max_workersThe default e parameter is 3. If the database contains many tables with a large number of writes, autovacuum_max_workers can cause a bottleneck and tables that need cleaning can wait a long time before being cleaned. Since Postgres 9.6, autovacuum can be observed with the new pg_stat_progress_vacuum view, but there is still no information on how many tables to evacuate. Using information from other views, you can estimate the size of the so-called autovacuum queue.

I would like to present another useful query for listing tables that require autovacuum. This query is a bit long, so here it isshortcutWithout going into the gist of this query function, I'd like to mention a few key points to remember:

  • The query returns a list of tables that require a void, normal, or enclosing scan.
  • The query takes into account information about the storage parameters of the table.
  • Important note: the query also shows the tables that Autovacuum is currently processing.

This query allows you to estimate the size of the queue and adjust the autovacuum accordingly. It's ok if the queue is empty, it means the auto vacuum can handle the amount of work. If the queue is not empty, it might be a good idea to set autovacuum to be more aggressive. There are several possibilities for this:

  1. Increase the number of autovacuum_max_workers – This will allow more autovacuum workers to run simultaneously.
  2. increaseautovacuum_vacuum_cost_limitovoid_cost_limit- This means more pages can be processed per round and vacuumed faster.
  3. reduceautovacuum_vacuum_cost_delay– This is a break between rounds when the automatic vacuum is idle. Reducing the delay allows the vacuum to rest less and work more.
  4. reduceautovacuum_vacuum_scale_factormiautovacuum_analyze_scale_factor– This is the proportion of dead lines or changes since the last scan and is used to calculate the threshold that the scan or table void should trigger. After reducing these scale factors, vacuum operations are performed more frequently on tables that require vacuum.

All of these methods can be used in various combinations and the most important point here is to remember to check memory usage, as too aggressive a vacuum can lead to increased I/Os, which in turn reduces capacity. response time and can affect overall power efficiency. .

(Video) How to Monitor PostgreSQL with Prometheus & Grafana ? #prometheus #grafana #postgresql #database

It would be a good idea to include information about the current car vacuum on the monitor and always have a clear picture of it.

Dive into Postgres stats: pg_stat_all_tables - Data Egret (1)

Finally, I would like to point out that the pg_stat_all_tables view is a very useful view and this post by no means covers all possible cases for its use. In addition, there is a similar pg_statio_all_tables view that contains information about table buffer I/O, and you can join this table with pg_stat_all_tables to make your stats queries even more informative.

I hope you liked the post, any questions comment!

(Video) Exploring 10 Postgres Tips and Tricks


What is the use of pg_stat_all_tables? ›

The pg_stat_all_tables view shows one row for each table in the current database (including TOAST tables) to display statistics about accesses to that specific table. The pg_stat_user_tables and pg_stat_sys_table s views contain the same information, but filtered to only show user and system tables respectively.

How to check stats of the table in PostgreSQL? ›

Use the ANALYZE command to collect statistics about a database, a table or a specific table column. The PostgreSQL ANALYZE command collects table statistics which support generation of efficient query execution plans by the query planner.

What is pg_stat_user_tables? ›

pg_stat_user_tables is a statistics view showing statistics about accesses to each non-system table in the current database.

What is Pg_stat_user_indexes? ›

pg_stat_user_indexes is a statistics view showing statistics about accesses to each user table index in the current database. pg_stat_user_indexes was added in PostgreSQL 7.2.

What is the difference between Pg_stat_user_tables and Pg_stat_all_tables? ›

The pg_stat_all_tables view shows one row for each table in the current database (including TOAST tables) to display statistics about accesses to that specific table. The pg_stat_user_tables and pg_stat_sys_table s views contain the same information, but filtered to only show user and system tables respectively.

How to create statistics in PostgreSQL? ›

CREATE TABLE t2 ( a int, b int ); INSERT INTO t2 SELECT mod(i,100), mod(i,100) FROM generate_series(1,1000000) s(i); CREATE STATISTICS s2 (mcv) ON a, b FROM t2; ANALYZE t2; -- valid combination (found in MCV) EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 1); -- invalid combination (not found in MCV) EXPLAIN ...

What is Pg_stat_reset ()? ›

The pg_stat_reset() function is used to reset all statistics for the database to 0: postgres=> select pg_stat_reset(); pg_stat_reset --------------- (1 row) postgres=> \x Expanded display is on.

How do I view statistics in a table in SQL? ›

SSMS to view SQL Server Statistics

Connect to a SQL Server instance in SSMS and expand the particular database. Expand the object ( for example, HumanResources. Employee), and we can view all available statistics under the STATISTICS tab. We can get details about any particular statistics as well.

How to check all indexes on a table in PostgreSQL? ›

If we want to list all indexes of a table and to connect to a PostgreSQL database, we can use the below psql command: \d table_name.

What is the difference between Pg_stat_activity and Pg_stat_statements? ›

The pg_stat_statments table holds information on queries that ran in the past, while the pg_stat_activity table holds information on queries running right this moment. The pg_stat_statements table has has one row per for each query that ran.

What does Pg_stat_activity show? ›

pg_stat_activity is a system view that allows you to identify active SQL queries in AnalyticDB for PostgreSQL instances. The pg_stat_activity view shows a server process and its related session and query in each row.

How to analyse query performance in PostgreSQL? ›

The ANALYZE option causes the statement to be actually executed, not only planned. The total elapsed time expended within each plan node (in milliseconds) and total number of rows it actually returned are added to the display. This is useful for seeing whether the planner's estimates are close to reality.

What is the difference between Pg_stat_all_indexes and Pg_stat_user_indexes? ›

The pg_stat_all_indexes view shows one row for each index in the current database that displays statistics about accesses to that specific index. The pg_stat_user_indexes and pg_stat_sys_indexes views contain the same information, but filtered to only show user and system indexes respectively.

Where is Pg_stat_activity? ›

pg_stat_activity is a view in the pg_catalog schema. You can query it by SELECT ing from it like any other table, e.g. SELECT * FROM pg_stat_activity .

What is Pg_activity? ›

pg_activity is an interactive terminal application for PostgreSQL server activity monitoring. Changes (since version 2.0. 0): Let libpq handle default values for connection options (hostname, port, database name and user name) Set application_name='pg_activity' for client connections.

How to check when the postgres table was last updated? ›

You can do it via checking last modification time of table's file. In postgresql,every table correspond one or more os files,like this: select relfilenode from pg_class where relname = 'test'; the relfilenode is the file name of table "test".

What is autovacuum in PostgreSQL? ›

PostgreSQL has an optional but highly recommended feature called autovacuum, whose purpose is to automate the execution of VACUUM and ANALYZE commands. When enabled, autovacuum checks for tables that have had a large number of inserted, updated or deleted tuples.

What is Seq_tup_read? ›

The seq_scan column tells you how many sequential (that is, table) scans have been performed for a given table, and seq_tup_read tells you how many rows were processed through table scans.

How to generate script for table data in PostgreSQL? ›

Generate table creation statement for an existing table
  1. Select the table you want to copy from the list in the left sidebar.
  2. Switch to the Structure tab at the bottom, or use shortcut keys Cmd + Ctrl + ]
  3. Click on the Definition button near the top bar.
Jul 24, 2018

What is Pg_stat_statements? ›

The pg_stat_statements module provides a means for tracking planning and execution statistics of all SQL statements executed by a server. The module must be loaded by adding pg_stat_statements to shared_preload_libraries in postgresql. conf , because it requires additional shared memory.

How to add data to PostgreSQL table? ›

Use INSERT INTO statement to insert one or more rows into a table in PostgreSQL. INSERT INTO <table-name> (<column1>, <column2>,...) VALUES (<value1>, <value2>,...) RETURNING * or <column_name>; Use the INSERT INTO clause with the table-name where you want to insert the data.

How to track table changes in PostgreSQL? ›

To track those changes made to tables in PostgreSQL you can write yourself a generic changelog trigger. The easiest way to do that is to write a generic PL/pgSQL function and use it for all tables in the system. As PostgreSQL provides good support for stored procedures, this is definitely not hard to do.

How to reset stats in PostgreSQL? ›

There is a group of PostgreSQL views that allow you to view various statistics on the database.
How to reset the pg_stat statistics tables.
  1. pg_stat_statements.
  2. pg_stat_all_tables.
  3. pg_statio_all_tables.
  4. pg_stat_all_indexes.
  5. pg_statio_all_indexes.
  6. pg_stat_activity.
  7. pg_stat_database.
Feb 10, 2020

How to list the databases in Postgres? ›

In summary, to list databases in Postgres, you can use the \l, \list, or \l+ commands in the psql command-line interface, or you can query the pg_catalog. pg_database system catalog. These methods will provide you with a list of databases on the server, along with information about each database.

How do you collect statistics from a table query? ›

When a column specified for ANALYZE_STATISTICS is first in a projection's sort order, the function reads all data from disk to avoid a biased sample.
  1. Collecting Table Statistics.
  2. Analyze All Database Tables.
  3. Analyze a Single Table.
  4. Analyze Table Columns.
  5. Data Collection Percentage.
  6. Sampling Size.

How to query all tables in PostgreSQL? ›

How to show all available tables in PostgreSQL?
  1. Using SQL Query. To show the list of tables with the corresponding schema name, run this statement: SELECT * FROM information_schema.tables; or in a particular schema: ...
  2. Using psql. To list all tables: In all schemas: \dt *. * ...
  3. Using TablePlus.
Apr 5, 2018

How to identify the query to check all indexes for a table? ›

To see indexes for all tables within a specific schema you can use the STATISTICS table from INFORMATION_SCHEMA: SELECT DISTINCT TABLE_NAME, INDEX_NAME FROM INFORMATION_SCHEMA. STATISTICS WHERE TABLE_SCHEMA = 'your_schema'; Removing the where clause will show you all indexes in all schemas.

How to get list of all indexes in SQL? ›

You can use the sp_helpindex to view all the indexes of one table. And for all the indexes, you can traverse sys. objects to get all the indexes for each table.

What is the difference between Pg_stat_statements and Pg_stat_monitor? ›

pg_stat_monitor is developed on the basis of pg_stat_statements as its more advanced replacement. While pg_stat_statements provides ever-increasing metrics, pg_stat_monitor aggregates the collected data, saving user efforts for doing it themselves.

How to enable Pg_stat_statements in PostgreSQL? ›

  1. Edit file postgresql.conf and add the next 3 lines (any where): shared_preload_libraries = 'pg_stat_statements' ...
  2. Restart PostgreSQL.
  3. Execute the next command on psql, pgAdmin or similar: CREATE EXTENSION pg_stat_statements;
  4. Checking some results: ...
  5. More information:

What is Pg_stat_activity in PostgreSQL 14? ›

3. pg_stat_activity. The pg_stat_activity view will have one row per server process, showing information related to the current activity of that process. Process ID of the parallel group leader, if this process is a parallel query worker.

What does idle mean in Pg_stat_activity? ›

Each row in pg_stat_activity represents an established connection to the server from a client. "idle" means the client is not currently executing a query nor in a transaction. If query_start_date is 2 days old, that just means the last query to be executed on that connection was two days ago.

How to check type of data in Postgres? ›

In PostgreSQL, the SELECT statement, information_schema, \d command, and pg_typeof() function are used to check the data type of a column. To check/find the data type of a particular column, use the information_schema or pg_typeof() function. The “\d” command and SELECT statement retrieve the data types of all columns.

What is the difference between Pg_cancel_backend and Pg_terminate_backend? ›

pg_cancel_backend() cancels the running query while pg_terminate_backend() terminates the entire process and thus the database connection. When a program creates a database connection and sends queries, you can cancel one query without destroying the connection and stopping the other queries.

How to improve Postgres query performance? ›

Another common and obvious way of optimizing PostgreSQL performance is by having enough indexes. This again depends heavily on the use case and the queries you'll be running often. The idea here is to filter as much data as possible so that there's less data to work with.

How to improve read performance in PostgreSQL? ›

PostgreSQL hardware optimization
  1. RAM. The more memory you have to store data, the more disk cache, less I/O, and better performance you receive. ...
  2. Hard disk. ...
  3. CPU. ...
  4. max_connections. ...
  5. shared_buffers. ...
  6. effective_cache_size. ...
  7. work_mem. ...
  8. fsync.

How to improve update query performance in postgres? ›

You could improve queries by better managing the table indexes. Indexes help to identify the disk location of rows that match a filter. If there is no index, Postgres will have to do a sequential scan of the whole table. The more rows there are, the more time it will take.

What is the difference between Idx_tup_read and Idx_tup_fetch? ›

idx_tup_read vs idx_tup_fetch

idx_tup_read represents the number of index entries returned by index scans. However, idx_tup_fetch returns the number of live table rows fetched by index scans. Live rows highlight rows that are not yet committed or dead rows. This difference can point a valuable insight.

How to check data location in PostgreSQL? ›

All the data needed for a database cluster is stored within the cluster's data directory, commonly referred to as PGDATA (after the name of the environment variable that can be used to define it). A common location for PGDATA is /var/lib/pgsql/data.

How to check the where condition in PostgreSQL? ›

The PostgreSQL WHERE clause is used to specify a condition while fetching the data from single table or joining with multiple tables. If the given condition is satisfied, only then it returns specific value from the table.

How to check PostgreSQL activity? ›

Postgres allows you to find the list of active sessions/connections on your PostgreSQL database server via the "pg_stat_activity" and pgAdmin's "Server Activity panel”. Both these approaches provide information about currently executing queries and other details, such as the user and client host for each session.

How do I check my PostgreSQL database status? ›

basically just type "systemctl status postgresql-xx" where xx is the version of your PostgreSQL instance. ex: systemctl status posgresql-10.

How do I get the latest record from a table in PostgreSQL? ›

Select the Most Recent Record (of Many Items) With PostgreSQL
  1. The problem.
  2. The impact of indexes.
  3. Development != Production.
  4. Option 1: Naive GROUP BY.
  5. Option 2: LATERAL JOIN.
  6. Option 3: TimescaleDB SkipScan.
  7. Option 4: Loose Index Scan.
  8. Option 5: Logging table and trigger.
Feb 4, 2022

How to monitor database performance in PostgreSQL? ›

To view performance metrics for a PostgreSQL database cluster, click the name of the database to go to its Overview page, then click the Insights tab. The Select object drop-down menu lists the cluster itself and all of the databases in the cluster. Choose the database to view its metrics.

How to vacuum full database in PostgreSQL? ›

VACUUM FULL rewrites the entire contents of the table into a new disk file with no extra space, allowing unused space to be returned to the operating system. This form is much slower and requires an ACCESS EXCLUSIVE lock on each table while it is being processed.

How to use Pg_dump PostgreSQL? ›

We show the general pattern when using pg_dump to create a PostgreSQL dump:
  1. pg_dump dbname > db.dump.
  2. psql dbname < db.dump.
  3. pg_restore --dbname=dbname db.dump.
  4. pg_dump --format=custom dbname > db.dump.
  5. hostname:port:database:username:password.
  6. pg_dump --version.
  7. pg_restore --version.
  8. psql --version.
Aug 12, 2022


1. Learn PostgreSQL Tutorial - Full Course for Beginners
2. How to use postgresql.conf to configure and tune the PostgreSQL server
3. Postgres Pulse: Using EXPLAIN ANALYZE for Planning and Optimizing Query Performance | PostgreSQL
4. PGConfRu2019 Alexey Lesovsky - «Troubleshooting in Postgres with pgCenter»
5. Metrics and Helpers | MONITORING PostgreSQL - Tour de pgwatch2
(CYBERTEC - PostgreSQL Services & Support)
6. Scaling Postgres Episode 74 | Picturing Vacuum | Recovery Changes | Cert Auth | Function Replication
(Scaling Postgres)
Top Articles
Latest Posts
Article information

Author: Cheryll Lueilwitz

Last Updated: 09/07/2023

Views: 5836

Rating: 4.3 / 5 (74 voted)

Reviews: 89% of readers found this page helpful

Author information

Name: Cheryll Lueilwitz

Birthday: 1997-12-23

Address: 4653 O'Kon Hill, Lake Juanstad, AR 65469

Phone: +494124489301

Job: Marketing Representative

Hobby: Reading, Ice skating, Foraging, BASE jumping, Hiking, Skateboarding, Kayaking

Introduction: My name is Cheryll Lueilwitz, I am a sparkling, clean, super, lucky, joyous, outstanding, lucky person who loves writing and wants to share my knowledge and understanding with you.