我在所有与一个“所有者”表相关的表之间有一些关系。因此,仅出于示例的目的:
ON DELETE CASCADE
。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 ....
您说有时从几秒到几小时不等。有相当多的行要删除。您可能要处理各种各样的因素,从数据缓存到行锁。不幸的是,如果这些是暂时性条件,那么在不发生时可能很难跟踪它们。