❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3300人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群近400 9群 200+,开10群PolarDB专业学习群100+)
在PolarDB 的非官方的数据库课程中,其中有一节提到了PolarDB for PostgreSQL 可以进行数据压缩,压缩比率非常高100%的数据经过压缩后,只剩下40%。在文章的评论区,我记得有一个同志问,这个会不会影响PostgreSQL的运行效率。
是的,其实不光他担心,传统DBA也担心这个问题,在POSTGRESQL中我们可以通过很多的方法对数据进行压缩,但这些方法都有一个问题,对CPU的消耗。所以提出这个问题的同志的担心是有必要的,但这里需要说明PolarDB for PostgreSQL的压缩是硬件压缩,也就是磁盘本身有压缩的功能,基于存算分离的设计和特性,这里磁盘的压缩和计算CPU是无关的。
但我们必须要经过测试才能证明这点,这里我们准备了两个数据库都是PolarDB for PostgreSQL 14,其中一个我们开启压缩,一个不开启压缩,其他的配置和功能完全一致。



压测很简单还是通过撰写一个测试的脚本来完成。
-- 清理旧表
DROP TABLE IF EXISTS table3;
DROP TABLE IF EXISTS table2;
DROP TABLE IF EXISTS table1;
-- 创建表结构
CREATE TABLE table1 (
id SERIAL PRIMARY KEY,
name TEXT,
value INT
);
CREATE TABLE table2 (
id SERIAL PRIMARY KEY,
table1_id INT REFERENCES table1(id),
description TEXT
);
CREATE TABLE table3 (
id SERIAL PRIMARY KEY,
table2_id INT REFERENCES table2(id),
tag TEXT
);
DO $$
DECLARE
i INT := 1;
start_time TIMESTAMP;
end_time TIMESTAMP;
BEGIN
RAISE NOTICE '开始插入 table1';
start_time := clock_timestamp();
WHILE i <= 1000000 LOOP
INSERT INTO table1(name, value) VALUES ('name_' || i, i);
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'table1 插入耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
i := 1;
RAISE NOTICE '开始插入 table2';
start_time := clock_timestamp();
WHILE i <= 1000000 LOOP
INSERT INTO table2(table1_id, description) VALUES ((random()*999999 + 1)::INT, 'desc_' || i);
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'table2 插入耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
i := 1;
RAISE NOTICE '开始插入 table3';
start_time := clock_timestamp();
WHILE i <= 1000000 LOOP
INSERT INTO table3(table2_id, tag) VALUES ((random()*999999 + 1)::INT, 'tag_' || i);
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'table3 插入耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
END
$$;
DO $$
DECLARE
i INT := 1;
start_time TIMESTAMP;
end_time TIMESTAMP;
BEGIN
RAISE NOTICE '开始更新 table1';
start_time := clock_timestamp();
WHILE i <= 100000 LOOP
UPDATE table1 SET value = value + 1 WHERE id = (random()*999999 + 1)::INT;
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'table1 更新耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
i := 1;
RAISE NOTICE '开始更新 table2';
start_time := clock_timestamp();
WHILE i <= 100000 LOOP
UPDATE table2 SET description = description || '_u' WHERE id = (random()*999999 + 1)::INT;
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'table2 更新耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
i := 1;
RAISE NOTICE '开始更新 table3';
start_time := clock_timestamp();
WHILE i <= 100000 LOOP
UPDATE table3 SET tag = tag || '_v' WHERE id = (random()*999999 + 1)::INT;
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'table3 更新耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
END
$$;
DO $$
DECLARE
i INT := 1;
start_time TIMESTAMP;
end_time TIMESTAMP;
dummy TEXT;
BEGIN
RAISE NOTICE '开始单表查询 table1';
start_time := clock_timestamp();
WHILE i <= 10000 LOOP
SELECT name INTO dummy FROM table1 WHERE id = (random()*999999 + 1)::INT;
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'table1 单表查询耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
i := 1;
RAISE NOTICE '开始单表查询 table2';
start_time := clock_timestamp();
WHILE i <= 10000 LOOP
SELECT description INTO dummy FROM table2 WHERE id = (random()*999999 + 1)::INT;
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'table2 单表查询耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
i := 1;
RAISE NOTICE '开始单表查询 table3';
start_time := clock_timestamp();
WHILE i <= 10000 LOOP
SELECT tag INTO dummy FROM table3 WHERE id = (random()*999999 + 1)::INT;
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE 'table3 单表查询耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
i := 1;
RAISE NOTICE '开始多表联查';
start_time := clock_timestamp();
WHILE i <= 10000 LOOP
SELECT t1.name, t2.description, t3.tag
INTO dummy, dummy, dummy
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.table1_id
JOIN table3 t3 ON t2.id = t3.table2_id
WHERE t1.id = (random()*999999 + 1)::INT
LIMIT 1;
i := i + 1;
END LOOP;
end_time := clock_timestamp();
RAISE NOTICE '多表联查耗时: % 秒', EXTRACT(SECOND FROM end_time - start_time);
END
$$;
下面我将执行的结果进行截图,方便大家比对
1 打开压缩的

2 关闭压缩的



数据插入,在数据插入的结果中明显开启压缩的情况CPU消耗要更平稳,而不开启压缩的PolarDB for PostgreSQL CPU突发的消耗会更多。
第二个测试,用大量的UPDATE对两个数据库进行同样的压力测试。

在测试中出现了一个与大部分人想法相反的情况,压缩的PolarDB for PostgreSQL 要比不压缩的IOPS低,也就是执行同样的指令尤其在数据UPDATE的操作中,压缩的PolarDB for PostgreSQL IOPS要更低。


3 最后我们通过多表的查询来对此次的测试压缩和不压缩的性能差别进行一个总结,我们执行同样的查询压测脚本在两个服务器上,同样的数据,同样的查询我们看看相关得到的结果



📊 PostgreSQL 查询耗时对比(单位:秒)


所以那个问PolarDB for PostgreSQL压缩后会性能变差吗,NO NO NO ,经过上面的测试给出的结果是,一定要压缩,压缩后系统又稳定,SQL运行又快,So good !
置顶
未知黑客通过SQL SERVER 窃取企业SAP核心数据,影响企业运营
那个MySQL大事务比你稳定,主从延迟低,为什么? Look my eyes! 因为宋利兵宋老师
非“厂商广告”的PolarDB课程:用户共创的新式学习范本--7位同学获奖PolarDB学习之星
说我PG Freezing Boom 讲的一般的那个同学,专帖给你,看看这次可满意
这个 PostgreSQL 让我有资本找老板要 鸡腿 鸭腿 !!
OceanBase Hybrid search 能力测试,平换MySQL的好选择
HyBrid Search 实现价值落地,从真实企业的需求角度分析 !不只谈技术!
OceanBase 光速快递 OB Cloud “MySQL” 给我,Thanks a lot
从“小偷”开始,不会从“强盗”结束 -- IvorySQL 2025 PostgreSQL 生态大会
被骂后的文字--技术人不脱离思维困局,终局是个 “死” ? ! ......
个群2025上半年总结,OB、PolarDB, DBdoctor、爱可生、pigsty、osyun、工作岗位等
从MySQL不行了,到乙方DBA 给狗,狗都不干? 我干呀!
SQL SERVER 2025发布了, China幸亏有信创!
MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL
PostgreSQL 新版本就一定好--由培训现象让我做的实验
删除数据“八扇屏” 之 锦门英豪 --我去-BigData!
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究》
疯狂老DBA 和 年轻“网红” 程序员 --火星撞地球-- 谁也不是怂货
和架构师沟通那种“一坨”的系统,推荐只能是OceanBase,Why ?
跟我学OceanBase4.0 --阅读白皮书 (OB分布式优化哪里了提高了速度)
跟我学OceanBase4.0 --阅读白皮书 (4.0优化的核心点是什么)
跟我学OceanBase4.0 --阅读白皮书 (0.5-4.0的架构与之前架构特点)
跟我学OceanBase4.0 --阅读白皮书 (旧的概念害死人呀,更新知识和理念)
MongoDB 相关文章
MongoDB “升级项目” 大型连续剧(4)-- 与开发和架构沟通与扫尾
MongoDB “升级项目” 大型连续剧(3)-- 自动校对代码与注意事项
MongoDB “升级项目” 大型连续剧(2)-- 到底谁是"der"
MongoDB “升级项目” 大型连续剧(1)-- 可“生”可不升
MongoDB 大俗大雅,上来问分片真三俗 -- 4 分什么分
MongoDB 大俗大雅,高端知识讲“庸俗” --3 奇葩数据更新方法
MongoDB 大俗大雅,高端的知识讲“通俗” -- 2 嵌套和引用
MongoDB 大俗大雅,高端的知识讲“低俗” -- 1 什么叫多模
MongoDB 合作考试报销活动 贴附属,MongoDB基础知识速通
MongoDB 使用网上妙招,直接DOWN机---清理表碎片导致的灾祸 (送书活动结束)
MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模
免费PolarDB云原生课程,听课“争”礼品,重塑云上知识,提高专业能力
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
POLARDB 添加字段 “卡” 住---这锅Polar不背
PolarDB 版本差异分析--外人不知道的秘密(谁是绵羊,谁是怪兽)
PolarDB 答题拿-- 飞刀总的书、同款卫衣、T恤,来自杭州的Package(活动结束了)
PolarDB for MySQL 三大核心之一POLARFS 今天扒开它--- 嘛是火
PostgreSQL 无服务 Neon and Aurora 新技术下的新经济模式 (翻译)
“PostgreSQL” 高性能主从强一致读写分离,我行,你没戏!
全世界都在“搞” PostgreSQL ,从Oracle 得到一个“馊主意”开始
PostgreSQL 加索引系统OOM 怨我了--- 不怨你怨谁
PostgreSQL “我怎么就连个数据库都不会建?” --- 你还真不会!
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
MySQL相关文章





