Postgres声称驱动器空间不足,可用空间充足

Posted

技术标签:

【中文标题】Postgres声称驱动器空间不足,可用空间充足【英文标题】:Postgres claiming to be out of space on drive with ample free space 【发布时间】:2012-07-19 15:24:15 【问题描述】:

我对 Postgres 比较陌生,但我遇到了一个奇怪的错误,而且谷歌搜索没有发现任何问题。

我创建了两个(相对较大的)表,每个表大约有 2 亿行。第一个有 4 行,第二个有 3 行。它们各自在每一列中存储 varchars。

我正在尝试通过连接这两个表并选择其中的三个列来创建第三个表。查询是:

create table table_C as 
(select table_A.id as id, table_A.predicate, table_B.object as type 
from table_A join table_B on 
table_A.subject = table_B.subject);

查询运行了大约 10 个小时,然后中止说

ERROR:  could not extend file "base/446695/504075.302": No space left on device
HINT:  Check free disk space.

我在一个具有 64GB 内存的 Amazon EC2 实例上运行它,我的数据库存储在一个有大约 500GB 空闲空间的卷上。我意识到生成的表应该很大,但原来的两个表只占用不到 100GB,所以如果一个有两列的表占用了 5 倍以上的空间,那就太奇怪了。我已经尝试了大约 4 次,并尝试重新启动实例。

我仔细检查了数据目录和 pg_stats_tmp 文件是否都指向了正确的卷。 (postgres.conf 中的“data_dir”和“pg_stat_tmp”设置)。

有什么想法吗?是否有其他临时文件可能在某处膨胀(根卷有超过 150GB 的可用空间)?

【问题讨论】:

使用 SELECT COUNT(*) 尝试相同的查询,忽略所有其他选定的字段。也许你在某个地方有一个不需要的笛卡尔积。 我尝试运行计数查询......它运行了大约两天,然后崩溃了 Postgres 服务器 =\ 你的意思是:SELECT COUNT(*) from table_A join table_B on table_A.subject = table_B.subject;? A和B的定义是什么?主题列有多独特? 是的,那个查询。表A是一堆RDF数据,分为subj、pred、obj。表 B 是两列,第一个表中的主题列表,然后是 URI 类型列表。表 A 是高度冗余的,但 B 至少应该接近于唯一的。 【参考方案1】:

如果主题重复,则连接将重复行组合。

例如

表1

    主题1 主题1 主题1 主题2

表2

    主题1 主题1 主题2 主题2

Subject1 结果为 6 小时,Subject2 为 2 行(共 8 行)

在最极端的情况下 - 主题完全相同 - 你将获得 2 亿 * 2 亿行。

我认为这是原因......

【讨论】:

我对 SQL 很陌生,所以我可能在做一些愚蠢的事情。第一个表中的主题不是唯一的,但在第二个表中是唯一的。我想要完成的是通过使用连接在第二个表(“地图”)中“查找”键(第一个表中的主题)并返回“附加”一列到第一个表"value",然后形成一个新行,类似于 first_table.subject second_table.value。因此,如果我了解这是如何工作的,我 italic 不会得到一个臃肿的笛卡尔积,因为第二个表中的重复很少(如果有的话)。 你是对的。如果第二张表中没有重复,您将获得与第一张表中相同的行数(可能减去第二张表中没有主题的一些行)

以上是关于Postgres声称驱动器空间不足,可用空间充足的主要内容,如果未能解决你的问题,请参考以下文章

LVM扩容,删除

树莓派外部安装的 NTFS 磁盘上没有足够的可用空间

如何在 Postgres 中获取当前的可用磁盘空间?

为啥SVN老是提交失败?提示空间不足。

mysql定时任务:删除和备份

我的HP本本C盘空间变小了?!