PostgreSQL V12创建临时表用尽了共享内存,可以在磁盘上创建吗?

问题描述 投票:0回答:1

在RHEL 7上运行PostgreSQL版本12系统具有28G内存和12G共享内存数据库在磁盘上使用超过6T有些行大约有3亿行。

将我的数据库从版本9移动到版本12,并且正在新数据库上运行测试。我们有一个过程在临时表中生成摘要数据,然后查询临时表中的不同内容,然后删除临时表-这比多次运行非常相似的查询快得多。

他们的查询与此类似:

CREATE TEMPORARY TABLE
        XXX
        AS
        SELECT
        COUNT(t.id) AS count,
        t.tagged AS tagged,
        t.tag_state AS tag_state,
        t.error AS error,
        td.duplicate AS duplicate
        FROM
        ttt t
        INNER JOIN tweet_data td ON (td.tweet_id = t.id)
        GROUP BY
        t.tagged,
        t.tag_state,
        t.error,
        td.duplicate;

请注意,这在V9上可以正常工作,但是,我没有在V9上非常仔细地观看过它,以了解它的作用。在V12上,共享内存使用量增长缓慢,然后在大约15分钟后迅速上升,增长到大约12G,然后试图使其更大并失败:

错误是:错误:无法将共享内存段“ /PostgreSQL.868719775”的大小调整为2147483648字节:设备上没有剩余空间

一时兴起,我们只运行了select语句而未创建临时表,并且在共享内存增加时它也失败了,但是错误消息说它被管理员杀死了。

我目前正在针对数据库运行真空,以查看是否有帮助。

最大的担忧是,这在V9上确实有效,但在V12上失败。我也知道,他们的查询引擎与V9相比非常不同,并且在V12中是新的。

我有些疯狂的希望,分阶段运行真空会有所作为。使用pg_upgrade迁移了数据。

vacuumdb -U postgres -p 5431 --all --analyze-in-stages

我不知道是否创建了临时表,但是在运行真空后,我们再次运行了完整查询,创建了临时表,它也失败了。

有什么想法吗?我是尝试更多共享内存的唯一选择吗?

postgresql shared-memory
1个回答
1
投票

这些共享内存段用于工作进程与parallel query之间的通信。

PostgreSQL似乎资源紧张,虽然错误是症状而不是问题的原因,但是您可以通过禁用此语句的并行查询来改善这种情况:

SET max_parallel_workers_per_gather = 0;

然后您的查询将花费更多时间,但是使用更少的资源,这可能足以解决问题。

从长远来看,您应该检查您的配置,这可能在内存或连接数量上过于慷慨,但我无法从此处进行诊断。

© www.soinside.com 2019 - 2024. All rights reserved.