我最近在从 PG 9.4 => 11 迁移时遇到了一个奇怪的问题
我使用将生产服务器从 PG 9.4 复制到 PG 11 pglogical
。一切都运行良好,除了我们发现一些复杂的查询在 PG 11 服务器上花费了数十秒,而在 9.4 服务器上花费了不到一秒。
事实证明,ANALYZE
在新服务器上运行可以解决缓慢的查询问题。因此,我检查$PGDATA/pg_stat
并发现它们在两台服务器上都是$PGDATA/pg_stat_tmp
空的!
PG在哪里存储统计信息?(跟进问题——pglogical
复制时不收集统计数据吗?)
编辑/跟进:
pg_stat_user_tables
新 PG 11 服务器上的查询输出-
select analyze_count,autoanalyze_count, count(*) from pg_stat_user_tables group by 1,2;
analyze_count | autoanalyze_count | count
---------------+-------------------+-------
1 | 11 | 1
4 | 7 | 1
1 | 0 | 14
4 | 0 | 168
(4 rows)
旧 PG 9.4 服务器(当前生产服务器)上的相同查询:
analyze_count | autoanalyze_count | count
---------------+-------------------+-------
0 | 13 | 3
0 | 226 | 1
0 | 1 | 31
0 | 5 | 6
0 | 21 | 2
0 | 16 | 2
0 | 601 | 1
0 | 8 | 1
0 | 20 | 1
0 | 4 | 2
0 | 9 | 2
0 | 10 | 2
0 | 12 | 1
0 | 7 | 2
0 | 41 | 1
0 | 2 | 11
0 | 6 | 1
0 | 3 | 8
0 | 731 | 1
0 | 39 | 1
0 | 11 | 1
0 | 0 | 99
0 | 50 | 1
0 | 66 | 1
0 | 241 | 1
0 | 14 | 2
有两种不同的统计数据,您将它们混淆了。一个是关于表列中值的分布等等。这些保存在表 pg_catalog.pg_statistic 和对用户更友好的视图 pg_stats 中。这是一个或多或少的普通数据库表。这些由 ANALYZE 和/或 VACUUM 或其“自动”等价物收集。
另一种统计记录了每个表上发生了多少次更新、插入等。在实时服务器上,您可以使用视图查看此数据
pg_stat_user_tables
和朋友,但这些视图背后没有真正的表格。这些统计信息影响第一种统计信息,因为它们用于决定 ANALYZE 和 VACUUM 自动运行的频率。这些存储在普通数据库表之外,在服务器运行时存储在“pg_stats_tmp”(或者任何设置为“stats_temp_directory”,如果它不是默认值),并在服务器关闭时移动到 pg_stat 进行冷存储。一旦发生崩溃,所有这些数据都会被丢弃。如果这两个目录都是空的,那么您可能关闭了“track_counts”,或者您可能将“stats_temp_directory”设置为非默认值,因此查找错误的位置。或者也许最近发生了崩溃,但尚未重建。如果您关闭了“track_counts”或“autovacuum”,这可以解释缺少最近的统计数据。或者,如果您非常快地填充新数据库,那么可能自动分析还没有机会完成它的工作。如果这些都不是这种情况,那么您将不得不考虑是否根本没有统计信息(pg_stats 种类),或者它们是否存在但不够新鲜。运行此查询可能会帮助您弄清楚:
但是很有可能你永远无法得出明确的结论,除非你愿意从头开始重新创造这种情况并在其中四处探索。
您会在文档中找到很多信息。
pg_stats
特别是,您会在视图中找到有关存储统计信息的信息(此处为文档),但您需要对架构表具有读取权限才能在其中查看数据。不要忘记检查您是否已连接到正确的数据库。干杯,