带有 where 子句“COLUMN_1 为空”的 PostgreSQL 选择查询挂起

问题描述

最近我们从没有停止数据库的情况下创建的备份中恢复了 Postgresql 数据库(我知道这是非常错误的,现在我们正在付出代价)。备份是简单的数据库目录备份。 现在我们注意到当我们执行

select *
from table
where COLUMN_1 is null

在我们的一个表中查询查询只是挂起(冻结)并且永远不会完成。同一表上的其他查询运行良好,distinct(COLUMN_1) 返回所有值。相同的查询在另一列 COLUMN_2 is null 上正确运行。那一栏好像有问题。

我如何修复这种可能损坏的桌子?

解决方法

使用 pg_dump 转储整个数据库并将其恢复到新集群。如果可行,它将消除所有数据损坏。

如果失败,您应该聘请专家。

如果您使用调试器附加到挂起的后端,您可以调查它在做什么(如果您熟悉源代码)。

,

我运行了 vacuum full,它解决了我的问题。查询现在在该表上使用 is null 子句执行。