更改表集统计信息需要表锁

sto*_*azy 5 postgresql postgresql-performance

我遇到过这样的情况:Pg 总是更喜欢对具有大约 70M 行的表进行顺序扫描。(索引扫描非常适合该查询,我已经通过设置enable_seq_scan = off确认了这一点,速度提高了200倍)

所以,为了帮助 Pg 更好地理解我的数据,我执行了这个

ALTER TABLE tablename ALTER COLUMN columnname SET STATISTICS 1000;

不幸的是,这需要更新独占锁来锁定整个表(锁太多)。

  1. 有没有办法避免锁定该语句?
  2. 该表的数据分片是基于主键范围进行的,因此我希望 Pg 能够更好地理解我的 Pk,以便它知道哪个 User 拥有大数据。如果我也增加PrimaryKey列的统计信息会有用吗?

Eva*_*oll 2

从您链接的文档中

设置统计数据

此形式为后续 ANALYZE 操作设置每列统计信息收集目标。目标可设置范围为0至10000;或者,将其设置为 -1 以恢复使用系统默认统计目标 (default_statistics_target)。有关 PostgreSQL 查询规划器使用统计信息的更多信息,请参阅第 14.2 节。

SET STATISTICS 获取SHARE UPDATE EXCLUSIVE 锁。

并且,在显式锁定的文档中

SHARE UPDATE EXCLUSIVE 与 SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE 和 ACCESS EXCLUSIVE 锁定模式冲突。此模式可保护表免受并发架构更改和 VACUUM 运行的影响。

由 VACUUM(不带 FULL)、ANALYZE、CREATE INDEX CONCURRENTLY、ALTER TABLE VALIDATE 和其他 ALTER TABLE 变体获取(有关完整详细信息,请参阅 ALTER TABLE)。

因此,您无法在分析发生时更改架构或清理。所以呢?它们应该发生得很快。几乎是瞬间。