最近,我将主键从INTEGER迁移到BIGINT,发现了一个article,其中作者在更新PK数据类型后手动更新表统计信息:

-- reanalyze the table in 3 steps
SET default_statistics_target TO 1;
ANALYZE [table];
SET default_statistics_target TO 10;
ANALYZE [table];
SET default_statistics_target TO DEFAULT;
ANALYZE [table];

据我所知,分析器自动在后台运行,以保持统计数据的最新.在Postgres docs(注释部分)中,我发现分析器在进行了一些重大更改后可以手动运行.

因此,问题是:

  • 如果启用了自动真空,手动运行分析仪有意义吗?如果是,在什么情况下?
  • 它的最佳实践是什么(例如上面的default_statistics_target个交换)?

推荐答案

自动吸尘器无法处理临时表.如果你想让他们有统计数据,你需要手动完成.

创建表达式索引会产生对新统计数据的需求,但不会安排自动分析的发生.因此,如果你做了其中之一,你应该手动进行分析.表重写与您链接到的类型更改类似,它们会销毁该列的旧统计数据,但不要安排自动分析来收集新的统计数据.最终,我们很可能会因为"自然"的营业额而再次分析这张桌子,但这可能需要很长的时间.(我们真的应该为此做点什么,这样它们就会自动发生)

如果表的某些部分比其他部分更频繁地更新和查询,表的冷批量可能会稀释由热部分驱动的活动计数器,这意味着在自动分析开始之前,快速变化部分的统计数据可能会变得非常过时.

即使批量操作的活动计数器确实驱动自动分析,也不知道它可能需要多长时间才能完成.这张桌子可能会卡在很多其他桌子后面,这些桌子已经在用吸尘器吸尘了,或者正在等待吸尘.如果您只是在重大更改后自己分析它,您就知道它会迅速启动,并且您将知道它何时完成(当您的提示返回时),而不需要启动对该问题的调查.

Database相关问答推荐

如何使用聚合管道从对象数组中获取正确的百分比

什么时候需要手动重新分析 PostgreSQL 中的表?

如何让 Google Drive Electron 表格像 MySQL 数据库一样工作吗?

创建一个spell check,判断具有合理运行时间的数据库

SQL 概念 LEFT OUTER JOIN 和 WHERE NOT EXISTS 基本相同吗?

Spring Framework 中的默认隔离级别

主必须包括表的分区位置错误中的所有列?

设计用于存储多人游戏的各种要求和统计数据的表格

如何在 Products 表的主键和自然键之间做出决定?

从 activerecord 获取索引哈希

恢复数据库备份时出错

在 Slick 3 的事务中执行非数据库操作

我什么时候应该考虑使用内存数据库,需要注意什么问题?

使用 PDO 获取单行单列

如何在 Postgres 9.6+ 中生成长度为 N 的随机、唯一的字母数字 ID?

添加具有初始(但不是默认)值的新列的最佳方法?

在 postgresql 中将 varchar 列升级为枚举类型

Rails 控制台 - 查找在某天创建的位置

在两列之间 Select 最近的日期

自引用表上的 SQL 递归查询 (Oracle)