当我在 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""
monthlyadjustedbudgettable
与 monthlyevaluatedbudgettable
的关系是 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
。
当我运行这行代码时。
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""
monthlyadjustedbudgettable
与 monthlyevaluatedbudgettable
的关系是 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
。