我让PostgreSQL15.3作为停靠容器运行. 我的 docker 运行配置是 -m 512g --memory-swap 512g --shm-size=16g

使用这种配置,我加载了36B行,在表和索引之间占用了大约30T. 我加载了大约24个并行操作,PG驱动程序使用连接池,因此有大约150个并发连接,但并不都是活动的. 我的postgresql.conf设置为

max_connections = 512 
max_locks_per_transaction = 1024

所有这一切运行起来都没有任何问题.

36B行表是子分区的.包含实际数据的层大约有80,000个表. 父代,按类别划分,每个按年划分,每个按月划分,每个按传感器ID划分,传感器ID是80K个数据表.

我的问题是,在我的一生中,如果没有 out of shared memory, you might need to increase max_locks_per_connection.事实上,我可以从单个表和月分区进行计数,但不能从年分区进行计数,年分区只有大约10K个表.

读到我需要锁表来保存共享内存中的max_connection * max_locks,我try 降低max_connections,并增加max_locks和共享内存,但没有成功. 目前我在 集装箱-m 512g --memory-swap 512g --shm-size=64g美元,

max_connections = 8 
max_locks_per_transaction = 163840

在配置中,当然是以增量的方式.

我确实有第二个表以相同的方式进行分区,数据量要小得多,但也有80K个表包含数据. 根据我所读到的,大概是这样的

max_connections = 100 
max_locks_per_transaction = 1600

应该覆盖160K表,如果每个锁占用168字节,则共享内存至少只需要26M.

对于我应该修改什么以及如何计算目标值,有什么建议吗?

推荐答案

拥有数量惊人的分区将需要数量惊人的锁.在使用平面分区的无索引表的简单情况下,您展示的max_connections * max_locks_per_connection个数字应该能够处理80000个表,但是在规划期间还需要锁定索引,即使它们最终不会在执行中使用.深度分区 struct 还需要更多的锁,但如果没有测试脚本来重现您的确切 struct ,我还没有测试它需要多少锁.

分区越多,处理分区就越不方便.这将使您可以拥有的分区数量在达到硬限制之前很久就会受到实际限制.我会说你已经超过了实际的极限.

这些问题只是PostgreSQL内部的问题. 如果您在OS/VM级别遇到内存问题,我希望它们会失败,并显示与您看到的不同的错误消息.

无论表是填充的还是只存在但为空的,锁定问题都应该是相同的,所以如果需要测试,只需导出不带数据的 struct (如pg_dump -s)就可以了.

Postgresql相关问答推荐

无法继承BYPASSRLS

PostgreSQL\d命令:有办法只 Select 一列吗?

Postgres 函数 now() 返回不正确的时区偏移量

订阅标签保存在哪个表中?

pgadmin db 限制服务器属性不起作用

JPA findBy 字段忽略大小写

Rails 迁移:PostgreSQL 上的 Bigint 似乎失败了?

AWS RDS 公开访问

如何在 PostgreSQL 中截断日期?

如何向文本字段添加长度约束

如何在 psycopg2 中使用服务器端游标

无法向 postgresql 数据库授予用户权限(对于 rails 应用程序)

如何判断每个组中是否存在值

postgresql:致命:password authentication failed for user "douglas"

如何在 postgres 模式中列出关系

在 postgres 中创建超级用户

如何使用 Django Migrations 重新创建已删除的表?

PostGIS - 将多面体转换为单面体

PostgreSQL 使用 UUID 与文本作为主键

PostgreSQL - GROUP BY 子句或用于聚合函数