作者:Hans-Jürgen Schönig
译者: 陈雁飞 崔鹏
作者简介
Hans-Jürgen Schönig:从20世纪90年代开始使用PostgreSQL,担任CYBERTEC公司的CEO和技术主管(www.cybertec-postgresql.com), CYBERTEC是该领域的市场领导者之一,自2000年以来已为全球无数客户提供服务。
译者简介
陈雁飞:开源PostgreSQL爱好者,一直从事PostgreSQL数据库运维工作
崔鹏:任职于海能达通信股份有限公司,致力于PostgreSQL数据库在专网通信领域的应用与推广
在PostgresSQL9.6中引入了并行查询,从那之后这一功能不断地得到扩展。在PostgreSQL11和PostgreSQL12中,数据库引擎增加了更多的功能。然而,仍然有一些与并行查询相关的问题,这些问题经常出现在培训过程中,因此有必要澄清说明一下。
顺序扫描的代价估计
为了说明并行查询的工作原理,创建一个简单的表,仅仅有两列,如下:
test=# CREATE TABLE t_test AS
SELECT id AS many, id % 2 AS few
FROM generate_series(1, 10000000) AS id;
SELECT 10000000
test=# ANALYZE;
ANALYZE
列many包含有1000万条不同数据,列few包含有两个不同的值。但是,出于演示用例的考虑,所有合理的大表都可以使用。
我们用来分析PostgreSQL优化器如何工作的查询语句也非常简单,如下:
test=# SET max_parallel_workers_per_gather TO 0;
SET
test=# explain SELECT count(*) FROM t_test;
QUERY PLAN
------------------------------------------------------------------------
Aggregate (cost=169248.60..169248.61 rows=1 width=8)
-> Seq Scan on t_test (cost=0.00..144248.48 rows=10000048 width=0)
(2 rows)
默认配置将自动使PostgreSQL进行并行顺序扫描,为了更加方便阅读,我们希望先不使用并行查询。
通过设置max_parallel_workers_per_gather为0可以关闭并行查询。如在执行计划中所看到的,顺序扫描的估算成本为144248,而整个语句估算成本是169248。那么PostgreSQL是如何计算得到这个数字呢?让我们先看下如下详细内容:
test=# SELECT pg_relation_size('t_test') AS size,
pg_relation_size('t_test') / 8192 AS blocks;
size | blocks
-----------+--------
362479616 | 44248
(1 row)
表t_test大概占用350MB空间并包含有44248个物理块。每个块将被顺序地读和处理。必须对这些块中所有行统计完才能得到最终结果。优化器使用下面的公式计算代价:
test=# SELECT current_setting('seq_page_cost')::numeric * 44248
+ current_setting('cpu_tuple_cost')::numeric * 10000000
+ current_setting('cpu_operator_cost')::numeric * 10000000;
?column?
-------------
169248.0000
(1 row)
可以看到,这里使用了两个参数:优化器使用seq_page_cost表示顺序读取一个块的代价。更重要的是,必须考虑到一个事实,即所有这些行在最终统计之前还必须通过CPU(cpu_tuple_cost)。使用cpu_operator_cost是因为计数基本上和为每一行调用“+1”相同。因此,在执行计划中得到顺序扫描的总代价为169248。
并行顺序扫描估计
在Cybertec数据库培训期间,有很多人对PostgreSQL的顺序扫描估算方式感到困惑并对这个有很多疑问。首先看下面的执行计划,看看会发生什么:
test=# SET max_parallel_workers_per_gather TO default;
SET
test=# explain SELECT count(*) FROM t_test;
QUERY PLAN
------------------------------------------------------------------------------------
Finalize Aggregate (cost=97331.80..97331.81 rows=1 width=8)
-> Gather (cost=97331.58..97331.79 rows=2 width=8)
Workers Planned: 2
-> Partial Aggregate (cost=96331.58..96331.59 rows=1 width=8)
-> Parallel Seq Scan on t_test (cost=0.00..85914.87 rows=4166687 width=0)
(5 rows)
如看到的那样,PostgreSQL决定使用2个CPU。但是PostgreSQL是如何考虑到这一点的呢?“rows=4166687”
答案就在下面的公式中:
10000048.0 / (2 + (1 – 0.3 * 2)) = 4166686.66 rows
PostgreSQL期望表中的行数为10000048(由前一次ANALYZE分析决定)。接下来的事情就是PostgreSQL试图决定一个核能做多少工作。但是上面这个公式的具体含义又是什么呢?
estimate = estimated_rows / (number_of_cores + (1 – leader_contribution * number_of_cores)

Leader进程通常需要花费大量精力给最终的结果。但是,假设leader花费大约30%的时间为工作进程提供服务。因此,随着核心数的增加,leader的贡献将降低。如果有4个或者更多的核工作,那么leader将不再对扫描有任何有意义的贡献——因此,PostgreSQL只会根据核心数来计算表的大小,而不是使用上面的公式。
其他并行操作
其他并行操作将使用类似的除数来估计这些操作所需的工作量。位图扫描等工作方式相同。
原文地址

http://shenghuo.china-bbs.com/cangzhou/ https://luohu.tiancebbs.cn/ http://ruanwen.xztcxxw.cn/shennongjia/ https://sgzhoubian.tiancebbs.cn/ http://jinqiang.ahtcbmw.cn/ghua/ http://km.lstcxxw.cn/shluwan/ http://huilong.sctcbmw.cn/wulumuqi/ https://wjchengnan.tiancebbs.cn/ https://fenlei.tiancebbs.cn/zhangjiakou/ http://taiying.njtcbmw.cn/bjft/ http://fuyang.tjtcbmw.cn/qhgl/ https://jinhua.tiancebbs.cn/ http://cf.lstcxxw.cn/xiamen/ http://js.sytcxxw.cn/kelamayi/ http://huaguang.jxtcbmw.cn/wulumuqi/ http://shenghuo.china-bbs.com/wlq/ http://shimai.zjtcbmw.cn/xinzhou/
https://taicang.tiancebbs.cn/hjzl/456846.html https://guangyuan.tiancebbs.cn/qths/457194.html https://zulin.tiancebbs.cn/sh/2147.html https://aihuishou.tiancebbs.cn/sh/638.html https://sz.tiancebbs.cn/pgjgsc/339616.html https://zulin.tiancebbs.cn/sh/3233.html https://taicang.tiancebbs.cn/hjzl/456889.html https://www.tiancebbs.cn/ershoufang/466951.html https://su.tiancebbs.cn/hjzl/464809.html https://zulin.tiancebbs.cn/sh/3478.html https://www.tiancebbs.cn/ershoufang/470320.html https://www.tiancebbs.cn/ershoufang/473035.html https://changshushi.tiancebbs.cn/hjzl/460033.html https://www.tiancebbs.cn/ershouwang/469808.html https://www.tiancebbs.cn/ershoufang/474533.html https://taicang.tiancebbs.cn/hjzl/465261.html https://www.tiancebbs.cn/ershoufang/473028.html
https://aihuishou.tiancebbs.cn/sh/2903.html https://bc.tiancebbs.cn/qths/470078.html https://heyuan.tiancebbs.cn/qths/469090.html https://aihuishou.tiancebbs.cn/store/2775/info-page-326.html https://jj.tiancebbs.cn/qths/472905.html https://www.tiancebbs.cn/ershoufang/473553.html https://heyuan.tiancebbs.cn/qths/460003.html https://huangnan.tiancebbs.cn/qths/460246.html https://changshushi.tiancebbs.cn/hjzl/464059.html https://www.tiancebbs.cn/ershoufang/468373.html https://mdj.tiancebbs.cn/qths/466423.html https://cy.tiancebbs.cn/qths/450815.html https://wh.tiancebbs.cn/qths/452833.html https://aihuishou.tiancebbs.cn/sh/810.html https://www.tiancebbs.cn/qtfwxx/473292.html https://aihuishou.tiancebbs.cn/sh/1601.html https://www.tiancebbs.cn/ershoufang/473929.html
https://www.tiancebbs.cn/ershoufang/469977.html https://zulin.tiancebbs.cn/sh/3254.html https://zulin.tiancebbs.cn/sh/1241.html https://dg.tiancebbs.cn/b2bbz/53047.html https://su.tiancebbs.cn/hjzl/466083.html https://zulin.tiancebbs.cn/sh/3944.html https://www.tiancebbs.cn/ershoufang/473592.html https://taicang.tiancebbs.cn/hjzl/459741.html https://www.tiancebbs.cn/ershoufang/469409.html https://www.tiancebbs.cn/ershoufang/472183.html https://www.tiancebbs.cn/ershouwang/472618.html https://jc.tiancebbs.cn/qths/470038.html https://aihuishou.tiancebbs.cn/sh/3790.html https://aihuishou.tiancebbs.cn/sh/4189.html https://bt.tiancebbs.cn/qths/472918.html https://changshushi.tiancebbs.cn/hjzl/457062.html https://zulin.tiancebbs.cn/sh/2067.html
十年后的我作文600字:https://www.nanss.com/xuexi/19304.html 寒食节纪念谁:https://www.nanss.com/wenti/19055.html 花旗参和西洋参的区别:https://www.nanss.com/yinshi/18947.html 红色康乃馨花语:https://www.nanss.com/shenghuo/19404.html 鸡头米的营养价值:https://www.nanss.com/yinshi/19555.html 世界环境日是哪天:https://www.nanss.com/wenti/19407.html 房地产营销策划:https://www.nanss.com/gongzuo/18718.html 沙盘是什么:https://www.nanss.com/wenti/19020.html 最小的一位数是1还是0:https://www.nanss.com/wenti/19878.html 长方形有几条对称轴:https://www.nanss.com/xuexi/19467.html 于丹论语心得:https://www.nanss.com/xuexi/19569.html 讨论报告:https://www.nanss.com/gongzuo/19748.html 西餐礼仪:https://www.nanss.com/shenghuo/19110.html 读昆虫记有感:https://www.nanss.com/xuexi/19689.html 学习制度:https://www.nanss.com/gongzuo/20132.html 校园安全主题班会:https://www.nanss.com/xuexi/18610.html 设计方案模板:https://www.nanss.com/gongzuo/19108.html 幼儿园教师心得:https://www.nanss.com/gongzuo/19705.html 民主生活会材料:https://www.nanss.com/gongzuo/18382.html 英语复习计划:https://www.nanss.com/xuexi/19134.html 水曲柳家具好不好:https://www.nanss.com/jiaju/18506.html 闪闪的什么:https://www.nanss.com/xuexi/19776.html 蜜蜂教学设计:https://www.nanss.com/xuexi/19209.html 信仰缺失:https://www.nanss.com/gongzuo/20052.html 1860年洗劫和烧毁圆明园的是:https://www.nanss.com/xuexi/18448.html 伤心的歌曲:https://www.nanss.com/shenghuo/18581.html 党校培训心得体会:https://www.nanss.com/gongzuo/19320.html 四面楚歌的主人公是谁:https://www.nanss.com/wenti/20142.html 昆虫记读后感500字:https://www.nanss.com/xuexi/19229.html 湿度多少合适:https://www.nanss.com/wenti/18220.html