当我在 Postgres 中删除一些记录时,查询 运行 太长

Query running is too long when I delete some records in Postgres

当我运行这行代码时。

DELETE from monthlyevaluatedbudgettable where budgetforyear = 2018;

只是在状态栏里说Query is Running.我觉得它不会结束,所以我会取消它,然后这个警告post在日志的消息中错误:

ERROR:  canceling statement due to user request
CONTEXT:  SQL statement "DELETE FROM ONLY "public"."monthlyadjustedbudgettable" WHERE  OPERATOR(pg_catalog.=) "budgetid""

********** Error **********

ERROR: canceling statement due to user request
SQL state: 57014
Context: SQL statement "DELETE FROM ONLY "public"."monthlyadjustedbudgettable" WHERE  OPERATOR(pg_catalog.=) "budgetid""

monthlyadjustedbudgettablemonthlyevaluatedbudgettable 的关系是 ON DELETE CASCADE。谁能告诉我问题出在哪里?

我在两个 table 中都有 182,095 条记录。他们的关系是 one-to-one.

您应该首先尝试在当前查询中使用 EXPLAIN 以查看详细情况。

关于您的删除查询为什么这么慢,我的直觉是您对 monthlyadjustedbudgettable 有一个 ON DELETE CASCADE 约束。这意味着对于 monthlyevaluatedbudgettable 中的每条记录,必须在 monthlyadjustedbudgettable 中进行检查,以查看是否也需要删除其中的任何记录。由于 table 上没有索引,因此可能正在进行完整的 table 扫描。鉴于您在每个 table 中有大约 200K 条记录,就所需时间而言,这可能会非常大。

您可以尝试快速修复。您可以在 monthlyadjustedbudgettable:

中的外键列上添加索引
CREATE UNIQUE INDEX budget_idx ON monthlyadjustedbudgettable (budgetid);

这假设 monthlyadjustedbudgettable 中的外键列称为 budgetid