1

我们使用 PostgreSQL 进行分析。我们对表执行的三个典型操作是:

  • 创建表作为选择
  • 创建表,然后在表中插入
  • 删除表

我们没有做任何事情UPDATEDELETE等等。

对于这种情况,我们可以假设估计是准确的吗?

SELECT reltuples AS estimate FROM pg_class where relname = 'mytable';
4

1 回答 1

3

随着autovacuum运行(这是默认设置),ANALYZEVACUUM自动启动 - 两者都是 update reltuples。(通常更频繁地运行)的基本配置参数ANALYZE,(引用手册):

autovacuum_analyze_threshold( integer)

指定ANALYZE在任何一个表中触发所需的最小插入、更新或删除元组数。默认值为 50 个元组。该参数只能在postgresql.conf文件中或服务器命令行中设置;但是可以通过更改表存储参数来覆盖单个表的设置。

autovacuum_analyze_scale_factor( floating point)

指定 autovacuum_analyze_threshold在决定是否触发 ANALYZE. 默认值为 0.1(表大小的 10%)。该参数只能在postgresql.conf文件中或服务器命令行中设置;但是可以通过更改表存储参数来覆盖单个表的设置。

另一句引述让我们深入了解细节:

出于效率原因,reltuples并且relpages不会即时更新,因此它们通常包含一些过时的值。它们由VACUUMANALYZE和一些 DDL 命令(例如CREATE INDEX. 不扫描整个表的VACUUMor操作(通常是这种情况)将根据它扫描的表部分增量更新计数,从而产生一个近似值。在任何情况下,规划器都会缩放它找到的值以匹配当前的物理表大小,从而获得更接近的近似值。ANALYZEreltuplespg_class

相应的估计是最新的。您可以将autovacuum设置更改为更具侵略性。您甚至可以按表执行此操作。看:

最重要的是,您可以像 Postgres 本身那样扩展估计。看:

请注意,VACUUM(与您的案例具有次要相关性)INSERT在 Postgres 13 之前并非仅由 s 触发。引用发行说明:

  • 允许插入,而不仅仅是更新和删除,以触发autovacuum(Laurenz Albe, Darafei Praliaskouski)中的吸尘活动

    以前,仅插入活动会触发自动分析,但不会触发自动真空,因为不能删除任何死元组。但是,真空扫描还有其他有用的副作用,例如设置页面所有可见位,这提高了仅索引扫描的效率。此外,允许仅插入表接收定期清理有助于分散“冻结”旧元组的工作,因此当整个表达到反环绕阈值时,不会突然有大量的冻结工作要做。立刻。

    autovacuum_vacuum_insert_threshold如有必要,可以使用新参数和 autovacuum_vacuum_insert_scale_factor或等效的表存储选项调整此行为 。

于 2021-11-17T04:29:40.333 回答