Postgres“无法写入哈希连接临时文件:设备上没有剩余空间”

Ben*_*son 6 postgresql performance postgresql-9.1 temporary-tables postgresql-performance

不久前我遇到了这个错误,我对两件事很好奇 -

1- postgres 的内部机制如何首先导致此消息发生?与数据库创建的临时文件的创建有关的哈希连接是什么?我知道这与创建一个超出数据库内存分配范围的临时文件有关,但我不知道为什么将其称为散列连接。

2- 我怎样才能预测和防止将来发生这样的错误(与性能和内存有关)?

Cra*_*ger 7

1- postgres 的内部机制如何首先导致此消息发生?

当连接两个非常大的数据集时,PostgreSQL 可以使用的一种策略是扫描一张表并散列其连接列。然后扫描另一个表并将连接列的哈希值与为第二个表计算的哈希值进行比较。

https://en.wikipedia.org/wiki/Hash_join

当您将一个小表与一个更大的表连接起来时,它非常有效,尤其是在没有索引适合连接条件的情况下。

PostgreSQL 可以对更大的表使用哈希连接策略,它首先将哈希表分区写入磁盘。这大概就是你得到的。

与数据库创建的临时文件的创建有关的哈希连接是什么?

哈希表。我真的不明白这个问题。

2- 我怎样才能预测和防止将来发生这样的错误(与性能和内存有关)?

有更多的备用磁盘空间用于临时存储。它不必在主表空间中;看temp_tablespaces设置。

据我所知,PostgreSQL 没有能力估计哈希表大小并决定哈希表对于可用磁盘空间来说太大了。