【问题标题】:How Can an Always-False PostgreSQL Query Run for Hours?始终为假的 PostgreSQL 查询如何运行数小时?
【发布时间】:2021-02-27 16:29:25
【问题描述】:

我一直在尝试在我们系统的另一部分调试慢查询,并看到此查询处于活动状态:

SELECT * FROM xdmdf.hematoma AS "zzz4" WHERE (0 = 1)

它显然已经活跃了 8 小时以上。使用WHERE 子句,从逻辑上讲,该查询应该返回零行。为什么 SQL 引擎还要费心去评估它?像这样的查询对任何事情都有用吗?如果有,它会是什么?

xdmdf.hematoma 是一个视图,我预计 SELECT * 在非锁定条件下需要大约 30 分钟。)

此声明:

explain select 1 from xdmdf.hematoma limit 1

(no analyze) 现在已经运行了大约 10 分钟。

【问题讨论】:

  • hematoma 是视图吗?
  • 为什么是的,是的。
  • edit您的问题并添加一个使用where false 的查询执行计划和另一个没有该条件的执行计划。请将它们添加为formatted text 并确保保留计划的缩进。粘贴文本,然后将``` 放在计划前一行和计划后一行。
  • 您是否仔细检查过pg_stat_activity 中的stateactive,而不是idle
  • 当查询处于“活动状态”时,您可以通过查看pg_stat_activity 中的wait_eventwait_event_type 来了解查询是否正在等待锁定

标签: sql postgresql database-deadlocks


【解决方案1】:

有两种可能:

  1. 计划语句需要很长时间,因为您更改了一些计划器设置并且视图定义非常复杂(分区表?)。

    这是不太可能的解释。

  2. 并发事务在视图定义中涉及的表上持有ACCESS EXCLUSIVE 锁。

    终止任何此类并发事务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2012-01-02
    • 2012-08-20
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多