Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Alter Table Set Statistics需要表锁_Postgresql_Postgresql Performance - Fatal编程技术网

Postgresql Alter Table Set Statistics需要表锁

Postgresql Alter Table Set Statistics需要表锁,postgresql,postgresql-performance,Postgresql,Postgresql Performance,我遇到过这样的情况,Pg总是倾向于对一个大约有7000万行的表进行顺序扫描。(索引扫描是该查询的理想选择,我通过设置enable_seq_scan=off确认了这一点,速度提高了200倍) 所以,为了帮助Pg更好地理解我的数据,我执行了这个 ALTER TABLE tablename ALTER COLUMN columnname SET STATISTICS 1000 不幸的是,这需要锁定整个表(锁太多) 是否有避免锁定此语句的解决方案 数据切分是基于主键范围为这个表进行的,所以我希望Pg能够

我遇到过这样的情况,Pg总是倾向于对一个大约有7000万行的表进行顺序扫描。(索引扫描是该查询的理想选择,我通过设置enable_seq_scan=off确认了这一点,速度提高了200倍)

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

ALTER TABLE tablename ALTER COLUMN columnname SET STATISTICS 1000

不幸的是,这需要锁定整个表(锁太多)

  • 是否有避免锁定此语句的解决方案
  • 数据切分是基于主键范围为这个表进行的,所以我希望Pg能够更好地理解我的Pk,以便它知道哪个用户拥有大数据。如果我也增加PrimaryKey列的统计信息,它会有用吗

  • 从你链接的文档中

    设置统计信息

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

    SET STATISTICS获取共享更新独占锁。

    而且,在

    共享更新独家版 与共享更新独占、共享、共享行独占、独占和访问独占锁定模式冲突。此模式保护表不受并发架构更改和真空运行的影响

    由VACUUM(无完整)获取、分析、并发创建索引、更改表验证和其他更改表变体(有关完整详细信息,请参阅更改表)


    因此,在进行分析时,您不能更改模式或真空。那又怎么样?它们应该发生得很快。几乎立刻

    这是一个共享更新独占锁,它只阻止表上的DDL,而不阻止DML。您真的需要在设置stats属性所需的极短时间内运行并发DDL语句吗?确切地说,“极短时间”在几毫秒的范围内。我在一张有5000万行的桌子上试了一下,花了大约5毫秒。如果您找不到一个5毫秒的窗口,无法运行DDL语句,则说明您的应用程序设计有问题(该语句未被任何正在运行的DML语句/事务阻止,也未阻止DML语句)@a_horse_with_no_name在Evan回答的评论中回答。如果你对我关于数据分片的第二个问题有任何想法。。请分享您的想法。我不理解对
    count(*)
    -设置统计信息
    的引用是不是非常即时?不,虽然它只扫描一个表,但我可能会对此关闭。不,它不扫描整个表。只是在一个有5000万行的表上尝试了这个。
    alter table
    大约用了5毫秒。很明显,它没有扫描表格。马和埃文,你们说得对,那么我就不知道为什么表格的DML在我执行该语句后不久就开始四处游荡了!除此之外,我非常确信在我的生产数据库中执行该语句花费了超过40秒的时间,我在40ish中中止了执行,表的所有其他操作开始正常运行。真空有可能在那里起到什么作用吗?除了暂停执行这个alter查询之外,还有什么解释可以解释我的DML受到了影响吗?