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声称驱动器空间不足,可用空间充足的主要内容,如果未能解决你的问题,请参考以下文章