为什么在DESTGRES 9上有时会花费很长时间?

问题描述 投票:4回答:1

我在所有与一个“所有者”表相关的表之间有一些关系。因此,仅出于示例的目的:

  • 具有PK ID的表所有者
  • 具有父表ID和FK owner_id的表父,引用Owner.id,上面有一个索引,ON DELETE CASCADE
  • 具有父表ID和FK父表ID的Table Child,引用Parent.id,并带有索引,并且是ON DELETE CASCADE

子表很大(约5000万行),父表有几千行,而所有者表很小(约10行)。

还有其他一些与所有者和父级有关的表,但它们相对较小(几千个),并且在外键和ON CASCADE DELETE上都有索引。

有时候,当我删除所有级联的所有者行(大约1200万个子行和一千个父级行)时,速度确实非常快(几秒钟,但有时要花一个小时。)

我如何找出是什么原因造成的?我在explain上做了delete from child where parent_id in (select id from parent where owner_id = 1),其中1是所有者行之一的ID(我尝试过各种ID以确保确定),并且说它正在使用位图堆扫描->位图索引扫描和索引扫描。但是,我不确定是否要模仿ON DELETE CASCADE触发器时实际执行的操作。我如何找出造成这些巨大延误的原因?可能是Postgres有时更喜欢进行顺序扫描(由于行数)吗?

插入相同的行仅需8分钟(包括应用程序逻辑和数千次事务提交,因此我不知道为什么直接删除要花这么长时间。

我正在使用Postgres 9.1.6

我在所有与一个“所有者”表相关的表之间有一些关系。因此,仅出于示例的目的:具有PK ID的表所有者具有PK ID和FK owner_id的表父,引用Owner ....

postgresql postgresql-9.1
1个回答
0
投票

您说有时从几秒到几小时不等。有相当多的行要删除。您可能要处理各种各样的因素,从数据缓存到行锁。不幸的是,如果这些是暂时性条件,那么在不发生时可能很难跟踪它们。

© www.soinside.com 2019 - 2024. All rights reserved.