AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 230381
Accepted
Saurabh Nanda
Saurabh Nanda
Asked: 2019-02-22 05:26:27 +0800 CST2019-02-22 05:26:27 +0800 CST 2019-02-22 05:26:27 +0800 CST

Postgres 在哪里存储所有统计信息?

  • 772

我最近在从 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
postgresql statistics
  • 2 2 个回答
  • 1264 Views

2 个回答

  • Voted
  1. Best Answer
    jjanes
    2019-02-22T08:39:07+08:002019-02-22T08:39:07+08:00

    有两种不同的统计数据,您将它们混淆了。一个是关于表列中值的分布等等。这些保存在表 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”设置为非默认值,因此查找错误的位置。或者也许最近发生了崩溃,但尚未重建。

    后续问题——pglogical 在复制时不收集统计信息吗?

    如果您关闭了“track_counts”或“autovacuum”,这可以解释缺少最近的统计数据。或者,如果您非常快地填充新数据库,那么可能自动分析还没有机会完成它的工作。如果这些都不是这种情况,那么您将不得不考虑是否根本没有统计信息(pg_stats 种类),或者它们是否存在但不够新鲜。运行此查询可能会帮助您弄清楚:

    select analyze_count,autoanalyze_count from pg_stat_user_tables
    

    但是很有可能你永远无法得出明确的结论,除非你愿意从头开始重新创造这种情况并在其中四处探索。

    • 2
  2. Arkhena
    2019-02-22T07:36:08+08:002019-02-22T07:36:08+08:00

    您会在文档中找到很多信息。

    pg_stats特别是,您会在视图中找到有关存储统计信息的信息(此处为文档),但您需要对架构表具有读取权限才能在其中查看数据。不要忘记检查您是否已连接到正确的数据库。

    干杯,

    • 0

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve