我们使用 PostgreSQL 进行分析。我们对表执行的三个典型操作是:
- 创建表作为选择
- 创建表,然后在表中插入
- 删除表
我们没有做任何事情UPDATE
,DELETE
等等。
对于这种情况,我们可以假设估计是准确的吗?
SELECT reltuples AS estimate FROM pg_class where relname = 'mytable';
我们使用 PostgreSQL 进行分析。我们对表执行的三个典型操作是:
我们没有做任何事情UPDATE
,DELETE
等等。
对于这种情况,我们可以假设估计是准确的吗?
SELECT reltuples AS estimate FROM pg_class where relname = 'mytable';
随着autovacuum
运行(这是默认设置),ANALYZE
并VACUUM
自动启动 - 两者都是 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
不会即时更新,因此它们通常包含一些过时的值。它们由VACUUM
、ANALYZE
和一些 DDL 命令(例如CREATE INDEX
. 不扫描整个表的VACUUM
or操作(通常是这种情况)将根据它扫描的表部分增量更新计数,从而产生一个近似值。在任何情况下,规划器都会缩放它找到的值以匹配当前的物理表大小,从而获得更接近的近似值。ANALYZE
reltuples
pg_class
相应的估计是最新的。您可以将autovacuum
设置更改为更具侵略性。您甚至可以按表执行此操作。看:
最重要的是,您可以像 Postgres 本身那样扩展估计。看:
请注意,VACUUM
(与您的案例具有次要相关性)INSERT
在 Postgres 13 之前并非仅由 s 触发。引用发行说明:
允许插入,而不仅仅是更新和删除,以触发
autovacuum
(Laurenz Albe, Darafei Praliaskouski)中的吸尘活动以前,仅插入活动会触发自动分析,但不会触发自动真空,因为不能删除任何死元组。但是,真空扫描还有其他有用的副作用,例如设置页面所有可见位,这提高了仅索引扫描的效率。此外,允许仅插入表接收定期清理有助于分散“冻结”旧元组的工作,因此当整个表达到反环绕阈值时,不会突然有大量的冻结工作要做。立刻。
autovacuum_vacuum_insert_threshold
如有必要,可以使用新参数和autovacuum_vacuum_insert_scale_factor
或等效的表存储选项调整此行为 。