我遇到了一个案例,Pg总是喜欢对一个大约70M行的表进行顺序扫描。 (索引扫描非常适合该查询,我已通过设置enable_seq_scan = off,速度提高了200倍来确认)
所以,为了帮助Pg更好地理解我的数据,我执行了这个
ALTER TABLE tablename ALTER COLUMN columnname SET STATISTICS 1000;
不幸的是,这需要Update Exclusive lock来锁定整个表(锁定太多)。
答案 0 :(得分:2)
来自您链接的文档
SET STATISTICS
此表单为后续ANALYZE操作设置每列统计信息收集目标。目标可以设置在0到10000的范围内;或者,将其设置为-1以恢复使用系统默认统计信息目标(default_statistics_target)。有关PostgreSQL查询计划程序使用统计信息的更多信息,请参见第14.2节。
SET STATISTICS获取 SHARE UPDATE EXCLUSIVE锁。
分享更新独家 与SHARE UPDATE EXCLUSIVE,SHARE,SHARE ROW EXCLUSIVE,EXCLUSIVE和ACCESS EXCLUSIVE锁定模式冲突。此模式可保护表免受并发模式更改和VACUUM运行的影响。
由VACUUM获取(无FULL),ANALYZE,同时创建索引,以及ALTER TABLE VALIDATE和其他ALTER TABLE变体(有关详细信息,请参阅ALTER TABLE)。
因此,在分析发生时,您无法更改架构或真空。所以呢?它们应该发生得非常快。几乎是瞬间。