3

我对 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 的可用空间)?

4

1 回答 1

1

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

例如

表格1

  1. 主题1
  2. 主题1
  3. 主题1
  4. 主题2

表2

  1. 主题1
  2. 主题1
  3. 主题2
  4. 主题2

结果将是 Subject1 的 6 小时和 Subject2 的 2 行(总共 8 行)

在最极端的情况下——主题完全一样——你会得到 2 亿 * 2 亿行。

我觉得是这个原因...

于 2012-07-19T19:26:29.133 回答