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

时间:2017-01-06 01:36:48

标签: postgresql postgresql-performance

我遇到了一个案例,Pg总是喜欢对一个大约70M行的表进行顺序扫描。 (索引扫描非常适合该查询,我已通过设置enable_seq_scan = off,速度提高了200倍来确认)

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

ALTER TABLE tablename ALTER COLUMN columnname SET STATISTICS 1000;

不幸的是,这需要Update Exclusive lock来锁定整个表(锁定太多)。

  1. 是否存在避免锁定此声明的解决方案?
  2. 基于主键范围对此表进行数据分片,因此我希望Pg更好地理解我的Pk,以便它知道哪个用户拥有大数据。如果我同时增加PrimaryKey列的统计信息会不会有用?

1 个答案:

答案 0 :(得分:2)

来自您链接的文档

  

SET STATISTICS

     

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

     

SET STATISTICS获取 SHARE UPDATE EXCLUSIVE锁。

并且,docs for Explicit Locking

  

分享更新独家   与SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE锁定模式冲突。此模式可保护表免受并发模式更改和VACUUM运行的影响。

     

由VACUUM获取(无FULL),ANALYZE,同时创建索引,以及ALTER TABLE VALIDATE和其他ALTER TABLE变体(有关详细信息,请参阅ALTER TABLE)。

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