PostgreSQL V12 create temp table 共享内存不足,我可以在磁盘上创建吗?
PostgreSQL V12 create temp table runs out of shared memory, can I create on disk?
运行 在 RHEL 7 上
PostgreSQL 版本 12
系统有28G内存,12G共享内存
数据库在磁盘上使用超过 6T
有些行有大约 3 亿行。
将我的数据库从版本 9 移至版本 12,并在新数据库上进行 运行 测试。我们有一个在临时 table 中生成摘要数据的过程,然后我们查询临时 table 不同的东西,然后我们删除临时 table - 比 [=49= 快得多] 多次非常相似的查询是这样做的原因。
他们的查询与此类似:
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 字节:设备上没有 space
一时兴起,我们 运行 只是 select 语句而没有创建临时 table 并且在共享内存增加时它也失败了,但是,错误消息说它被管理员杀死了。
我目前正在 运行 清理数据库以查看是否有帮助。
最大的问题是这确实适用于 V9,但在 V12 上失败。我还知道,与 V9 相比,他们的查询引擎在 V12 中非常不同并且是新的。
我疯狂地希望 运行 阶段性真空会有所作为。使用 pg_upgrade 迁移数据。
vacuumdb -U postgres -p 5431 --all --analyze-in-stages
我不知道是否创建了临时 table,但是,在 运行 vacuum 之后,我们 运行 完整查询再次创建临时 table 也失败了。
有什么想法吗?尝试更多共享内存是我唯一的选择吗?
这些共享内存段用于工作进程与parallel query之间的通信。
PostgreSQL 似乎资源紧张,虽然错误是症状而不是问题的原因,但您可以通过禁用此语句的并行查询来改善这种情况:
SET max_parallel_workers_per_gather = 0;
那么您的查询将花费更多时间,但使用更少的资源,这可能足以解决问题。
在漫长的 运行 中,您应该检查您的配置,它可能对内存或连接数过于慷慨,但我无法从这里诊断。
运行 在 RHEL 7 上 PostgreSQL 版本 12 系统有28G内存,12G共享内存 数据库在磁盘上使用超过 6T 有些行有大约 3 亿行。
将我的数据库从版本 9 移至版本 12,并在新数据库上进行 运行 测试。我们有一个在临时 table 中生成摘要数据的过程,然后我们查询临时 table 不同的东西,然后我们删除临时 table - 比 [=49= 快得多] 多次非常相似的查询是这样做的原因。
他们的查询与此类似:
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 字节:设备上没有 space
一时兴起,我们 运行 只是 select 语句而没有创建临时 table 并且在共享内存增加时它也失败了,但是,错误消息说它被管理员杀死了。
我目前正在 运行 清理数据库以查看是否有帮助。
最大的问题是这确实适用于 V9,但在 V12 上失败。我还知道,与 V9 相比,他们的查询引擎在 V12 中非常不同并且是新的。
我疯狂地希望 运行 阶段性真空会有所作为。使用 pg_upgrade 迁移数据。
vacuumdb -U postgres -p 5431 --all --analyze-in-stages
我不知道是否创建了临时 table,但是,在 运行 vacuum 之后,我们 运行 完整查询再次创建临时 table 也失败了。
有什么想法吗?尝试更多共享内存是我唯一的选择吗?
这些共享内存段用于工作进程与parallel query之间的通信。
PostgreSQL 似乎资源紧张,虽然错误是症状而不是问题的原因,但您可以通过禁用此语句的并行查询来改善这种情况:
SET max_parallel_workers_per_gather = 0;
那么您的查询将花费更多时间,但使用更少的资源,这可能足以解决问题。
在漫长的 运行 中,您应该检查您的配置,它可能对内存或连接数过于慷慨,但我无法从这里诊断。