Postgresql 为什么在第9期博士后考试中,有时会花很长时间?

Postgresql 为什么在第9期博士后考试中,有时会花很长时间?,postgresql,postgresql-9.1,Postgresql,Postgresql 9.1,我在表之间有一些关系,这些表都与一个“所有者”表相关。所以,就为了这个例子: 具有PK id的表所有者 具有PK id和FK owner_id的表父级引用了owner.id,表父级上有索引,表父级上有删除级联。 具有PK id和FK parent_id的表子级引用parent.id,其上有索引,并且在DELETE级联上。 子表是巨大的~5000万行,父表有几千行,所有者表非常小~10行 还有一些其他表与Owner和Parent相关,但它们相对较小,只有几千个,并且在外键和cascadedelet

我在表之间有一些关系,这些表都与一个“所有者”表相关。所以,就为了这个例子:

具有PK id的表所有者 具有PK id和FK owner_id的表父级引用了owner.id,表父级上有索引,表父级上有删除级联。 具有PK id和FK parent_id的表子级引用parent.id,其上有索引,并且在DELETE级联上。 子表是巨大的~5000万行,父表有几千行,所有者表非常小~10行

还有一些其他表与Owner和Parent相关,但它们相对较小,只有几千个,并且在外键和cascadedelete上也有索引

有时,当我删除一个所有者行时,会在所有行中级联删除大约1200万个子行和1000个父行,这在几秒钟内运行得非常快,但有时需要将近一个小时

我如何找出是什么原因造成的?我确实解释了从子级删除,其中父级\u id在从父级选择id中,其中所有者\u id=1,其中1是一个所有者行的id,我尝试了各种id,只是为了确保它正在使用位图堆扫描->位图索引扫描和索引扫描。然而,我不确定我是否在模仿当存在ON-DELETE级联触发器时实际执行的操作。我怎样才能找出造成这些巨大延误的原因?可能是因为行数太多,有时Postgres更喜欢进行顺序扫描吗

插入相同的行只需要8分钟,包括应用程序逻辑和几千个事务提交,所以我无法理解为什么直接删除要花这么长时间


我用的是Postgres 9.1.6,你说有时候它从几秒钟到几小时。有相当多的行要删除。您可能要处理各种各样的因素,从数据缓存到行锁。不幸的是,如果这些都是瞬态条件,那么当它们没有发生时,可能很难找到它们


你应该首先看看你是否能找到任何模式。查看发生时从pg_锁中选择*。当问题发生时,您还应该从pg_stat_活动中选择*以查看锁的存放位置。

请尝试解释Analyzered EXPLAIN Analysis on delete FROM child,其中在Selecte_id FROM parent中的parent_id,其中owner_id=1并获得相同的位图堆扫描->位图索引等。获得这些成本:成本=150.01..562757.84行=6560827宽度=12实际时间=39.792..39.792行=0循环=1统计数据错误严重-因此位图索引扫描不是最佳的-请尝试禁用位图扫描-将启用位图扫描设置为offI执行将启用位图扫描设置为off并再次解释分析,现在它仅使用索引扫描。然而,我再次尝试删除,但仍然需要很长时间:@Matthieu不幸没有。现在已经有几年了,但如果我记得清楚的话,当我需要删除大量由外键链接的子项时,我删除了索引,然后重建了它们。没有锁,没有其他人访问数据库。事实上,我有时只是删除数据库来清除数据,因为删除它需要很长时间,而且它允许我。是的,有大量的行,但是插入它们需要8分钟,所以删除它们需要几个小时是没有意义的。我最近从默认值增加了共享缓冲区和有效缓存大小,这似乎有一些效果,将其缩短到大约20分钟。。。更好,但不确定是否最佳。