作者: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)

CENTER_PostgreSQL_Community

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

其他并行操作

其他并行操作将使用类似的除数来估计这些操作所需的工作量。位图扫描等工作方式相同。

原文地址

https://www.cybertec-postgresql.com/en/how-postgresql-estimates-parallel-queries/

CENTER_PostgreSQL_Community

请在登录后发表评论,否则无法保存。
1楼 xcvxcvsdf
2024-11-22 10:48:07+08

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/

2楼 xcvxcvsdf
2024-10-26 16:29:50+08

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

3楼 xcvxcvsdf
2024-10-26 12:18:49+08

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

4楼 xcvxcvsdf
2024-10-17 18:07:37+08

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

5楼 xiaowu
2024-04-24 10:43:57+08

十年后的我作文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

© 2010 PostgreSQL中文社区