Updated on 2024-05-07 GMT+08:00

Updating Statistics

In a database, statistics indicate the source data of a plan generated by an optimizer. If no statistics are collected or the statistics are outdated, the execution plan may deteriorate severely, causing performance problems.

Scenario

The ANALYZE statement collects statistics about table contents in databases and stores the statistics in the PG_STATISTIC system catalog. Then, the query optimizer uses the statistics to work out the most efficient execution plan.

After executing batch INSERT and DELETE operations, you are advised to run the ANALYZE statement on the table or the entire database to update statistics. By default, 30,000 rows of statistics are sampled. (The default value of the GUC parameter default_statistics_target is 100.) If the total number of rows in the table exceeds 1,600,000, you are advised to set default_statistics_target to -2, indicating that 2% of the statistics are collected.

For an intermediate table generated during the execution of a batch script or stored procedure, you also need to run the ANALYZE statement.

If there are multiple inter-related columns in a table, and the conditions or grouping operations based on these columns are involved in the query, you can collect statistics about these columns so that the query optimizer can accurately estimate the number of rows and generate an effective execution plan.

Procedure

Run the following commands to update the statistics about a table or the entire database:

ANALYZE tablename;                        --Update statistics about a table.
ANALYZE;                                  --Update statistics about the entire database.

Run the following statements to perform statistics-related operations on multiple columns:

ANALYZE tablename ((column_1, column_2));                       --Collect statistics about column_1 and column_2 of tablename.
 
ALTER TABLE tablename ADD STATISTICS ((column_1, column_2));    --Declare statistics about column_1 and column_2 of tablename.
ANALYZE tablename;                                               --Collect statistics about one or more columns.
 
ALTER TABLE tablename DELETE STATISTICS ((column_1, column_2)); --Delete statistics about column_1 and column_2 of tablename or their statistics declaration.

After the statistics are declared for multiple columns by running the ALTER TABLE tablename ADD STATISTICS statement, the system collects the statistics about these columns next time ANALYZE is performed on the table or the entire database.

To collect the statistics, run the ANALYZE statement.

Use EXPLAIN to show the execution plan of each SQL statement. If rows=10 (the default value, probably indicating that the table has not been analyzed) is displayed in the SEQ SCAN output of a table, run the ANALYZE statement for this table.