PostgreSQL DBA(95) - PG 12 Partition(out of shared memory)
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,PostgreSQL 12 Beta3,创建包含8192个子分区的分区表,执行查询语句,在分区键上排序,出错。数据库版本:[local]:5432 pg12@testdb=# select versi
千家信息网最后更新 2025年01月31日PostgreSQL DBA(95) - PG 12 Partition(out of shared memory)
PostgreSQL 12 Beta3,创建包含8192个子分区的分区表,执行查询语句,在分区键上排序,出错。
数据库版本:
[local]:5432 pg12@testdb=# select version(); version -------------------------------------------------------------------------------------------- PostgreSQL 12beta3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit(1 row)Time: 9.511 ms
数据表结构
[local]:5432 pg12@testdb=# \d t_hash_manypartitions Partitioned table "public.t_hash_manypartitions" Column | Type | Collation | Nullable | Default --------+-----------------------+-----------+----------+--------- c1 | integer | | | c2 | character varying(40) | | | c3 | character varying(40) | | | Partition key: HASH (c2)Number of partitions: 8191 (Use \d+ to list them.)
只有1行数据
[local]:5432 pg12@testdb=# insert into t_hash_manypartitions(c1,c2,c3) values(0,'c2-0','c3-0');INSERT 0 1Time: 14.038 ms[local]:5432 pg12@testdb=# select * from t_hash_manypartitions; c1 | c2 | c3 ----+------+------ 0 | c2-0 | c3-0(1 row)Time: 917.996 ms[local]:5432 pg12@testdb=#
虽然只有1行数据,但全表扫描仍然很慢,接近1s,而普通表仅几毫秒。
[local]:5432 pg12@testdb=# select * from t_hash_manypartitions; c1 | c2 | c3 ----+------+------ 0 | c2-0 | c3-0(1 row)Time: 898.615 ms[local]:5432 pg12@testdb=# select * from t_hash_manypartitions; c1 | c2 | c3 ----+------+------ 0 | c2-0 | c3-0(1 row)Time: 898.783 ms[local]:5432 pg12@testdb=#
执行查询,在分区键c2上排序
[local]:5432 pg12@testdb=# select * from t_hash_manypartitions order by c2;ERROR: out of shared memoryHINT: You might need to increase max_locks_per_transaction.CONTEXT: parallel workerTime: 2420.971 ms (00:02.421)[local]:5432 pg12@testdb=#
提示out of shared memory,内存溢出
[local]:5432 pg12@testdb=# alter system set max_locks_per_transaction=128;ALTER SYSTEMTime: 7.705 ms[local]:5432 pg12@testdb=# select * from t_hash_manypartitions order by c2;ERROR: out of shared memoryHINT: You might need to increase max_locks_per_transaction.CONTEXT: parallel workerTime: 1988.893 ms (00:01.989)[local]:5432 pg12@testdb=# alter system set max_locks_per_transaction=512;ALTER SYSTEMTime: 13.137 ms[local]:5432 pg12@testdb=# select * from t_hash_manypartitions order by c2;ERROR: out of shared memoryHINT: You might need to increase max_locks_per_transaction.CONTEXT: parallel workerTime: 1968.974 ms (00:01.969)[local]:5432 pg12@testdb=# alter system set max_locks_per_transaction=8192;ALTER SYSTEMTime: 4.060 ms[local]:5432 pg12@testdb=# select * from t_hash_manypartitions order by c2;ERROR: out of shared memoryHINT: You might need to increase max_locks_per_transaction.CONTEXT: parallel workerTime: 1985.106 ms (00:01.985)[local]:5432 pg12@testdb=# alter system set max_locks_per_transaction=16384;ALTER SYSTEMTime: 7.791 ms[local]:5432 pg12@testdb=# select * from t_hash_manypartitions order by c2;ERROR: out of shared memoryHINT: You might need to increase max_locks_per_transaction.CONTEXT: parallel workerTime: 1953.134 ms (00:01.953)[local]:5432 pg12@testdb=#
可以看到,增大该参数值至16384,仍然报错。 修改此参数需重启数据库,重启数据库后重新执行即可
查看执行计划,PG在每个分区上执行并行扫描,然后使用Parallel Append合并结果集,然后再执行排序。
[local]:5432 pg12@testdb=# explain select * from t_hash_manypartitions order by c2; QUERY PLAN -------------------------------------------------------------------------------------------- Gather Merge (cost=455382.87..734442.42 rows=2391772 width=200) Workers Planned: 2 -> Sort (cost=454382.84..457372.56 rows=1195886 width=200) Sort Key: t_hash_manypartitions_1.c2 -> Parallel Append (cost=0.00..104753.25 rows=1195886 width=200) -> Parallel Seq Scan on t_hash_manypartitions_1 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_2 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_3 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_4 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_5 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_6 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_7 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_8 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_9 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_10 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_11 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_12 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_13 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_14 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_15 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_16 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_17 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_18 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_19 (cost=0.00..12.06 rows=206 width=200) -> Parallel Seq Scan on t_hash_manypartitions_20 (cost=0.00..12.06 rows=206--More--
在PG 11.2上则没有问题
testdb=# select version(); version -------------------------------------------------------------------------------------------- PostgreSQL 11.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16), 64-bit(1 row)testdb=# select * from t_hash_manypartitions order by c2; c1 | c2 | c3 ----+------+------ 0 | c2-0 | c3-0(1 row)testdb=#
数据
数据库
排序
参数
只有
查询
普通
个子
内存
数据表
版本
结构
结果
语句
问题
分区表
提示
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络技术应用教学总结反思
数据库ER图1与N
数据库和redis事务冲突
赤壁市解封网络技术
国有企业网络安全形势
cdma网络时钟服务器
网络安全严防泄密
小学网络安全主题表演
数据库关系属性
哪所大学有icsd数据库
绵阳网络技术联系方式
北京家用软件开发服务价格
发电厂工控网络安全
直播软件开发大概多少钱
网络安全法 要点
恶魔之魂联机服务器
2021关于网络安全宣传作文
轩辕服务器安全吗
江苏省移动网络安全大赛
卫生健康行业网络安全知识
软件开发维护框架合同
杭州未来科技城除了互联网还有啥
青浦区正规数据库电话多少
内网数据库
医院化学品安全数据库
美团网络安全比赛
深圳net软件开发哪家正规
海阳市网络安全等级培训会
区块链网络安全安博通
服务态度好的郑州软件开发