Postgresql源码(106)Generic Plan与Custom Plan的区别(以分区表为例)

news2024/12/23 4:06:58

相关:
《Postgresql源码(105)分区表剪枝代码分析》
《Postgresql源码(106)Generic Plan与Custom Plan的区别(以分区表为例)》

实例

CREATE TABLE measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
) PARTITION BY RANGE (logdate);

CREATE TABLE measurement_y2006m01 PARTITION OF measurement FOR VALUES FROM ('2006-01-01') TO ('2006-02-01');
CREATE TABLE measurement_y2006m02 PARTITION OF measurement FOR VALUES FROM ('2006-02-01') TO ('2006-03-01');
CREATE TABLE measurement_y2006m03 PARTITION OF measurement FOR VALUES FROM ('2006-03-01') TO ('2006-04-01');
CREATE TABLE measurement_y2006m04 PARTITION OF measurement FOR VALUES FROM ('2006-04-01') TO ('2006-05-01');
CREATE TABLE measurement_y2006m05 PARTITION OF measurement FOR VALUES FROM ('2006-05-01') TO ('2006-06-01');

insert into measurement values (1, '2006-01-03', floor(random() * 100), floor(random() * 100));
insert into measurement values (2, '2006-02-04', floor(random() * 100), floor(random() * 100));
insert into measurement values (3, '2006-03-05', floor(random() * 100), floor(random() * 100));
insert into measurement values (4, '2006-03-06', floor(random() * 100), floor(random() * 100));
insert into measurement values (5, '2006-03-07', floor(random() * 100), floor(random() * 100));
insert into measurement values (6, '2006-03-08', floor(random() * 100), floor(random() * 100));
insert into measurement values (7, '2006-04-09', floor(random() * 100), floor(random() * 100));
insert into measurement values (8, '2006-04-10', floor(random() * 100), floor(random() * 100));
insert into measurement values (9, '2006-05-11', floor(random() * 100), floor(random() * 100));
insert into measurement values (10, '2006-05-12', floor(random() * 100), floor(random() * 100));
prepare p1 (date, date) as select * from measurement where logdate between $1 and $2;

explain analyze execute p1('2006-04-05', '2006-04-20');

首先看Custom Plan(强制choose_custom_plan返回true)

postgres=# explain analyze execute p1('2006-04-05', '2006-04-20');

                                                         QUERY PLAN                                                         
----------------------------------------------------------------------------------------------------------------------------
 Seq Scan on measurement_y2006m04 measurement  (cost=0.00..37.75 rows=9 width=16) (actual time=0.017..0.020 rows=6 loops=1)
   Filter: ((logdate >= '2006-04-05'::date) AND (logdate <= '2006-04-20'::date))
 Planning Time: 1620.157 ms
 Execution Time: 0.041 ms

再看Generic Plan(强制choose_custom_plan返回false)

postgres=# explain analyze execute p1('2006-04-05', '2006-04-20');
                                                             QUERY PLAN                                                             
------------------------------------------------------------------------------------------------------------------------------------
 Append  (cost=0.00..188.97 rows=45 width=16) (actual time=0.027..0.034 rows=6 loops=1)
   Subplans Removed: 4
   ->  Seq Scan on measurement_y2006m04 measurement_1  (cost=0.00..37.75 rows=9 width=16) (actual time=0.024..0.028 rows=6 loops=1)
         Filter: ((logdate >= $1) AND (logdate <= $2))
 Planning Time: 28898.081 ms
 Execution Time: 0.102 ms
(6 rows)

问题一:看起来都剪枝了?

是的,从计划上来看,只能看到4月表,确实都剪枝了。

但仔细看还是有区别的,Generic Plan多了一行Subplans Removed: 4。这表示Generic计划实际是没剪枝的,是运行时做的prune。

证明:查看GetCachedPlan生成plan,可以看到下面的计划树把每个月分片都戴上了,明显未剪枝:
在这里插入图片描述
计划中是没剪枝的,但在计划中记录了裁剪的信息:make_partition_pruneinfo。

然后在执行器启动阶段:

#0  ExecInitAppend (node=0x17435a8, estate=0x173b3b0, eflags=16) at nodeAppend.c:111
#1  0x00000000007566d8 in ExecInitNode (node=0x17435a8, estate=0x173b3b0, eflags=16) at execProcnode.c:182
#2  0x000000000074c12c in InitPlan (queryDesc=0x1737b48, eflags=16) at execMain.c:938
#3  0x000000000074b112 in standard_ExecutorStart (queryDesc=0x1737b48, eflags=16) at execMain.c:265
#4  0x000000000074ae78 in ExecutorStart (queryDesc=0x1737b48, eflags=0) at execMain.c:144
#5  0x00000000006a69fc in ExplainOnePlan (plannedstmt=0x1743510, into=0x0, es=0x1744b70,  queryString=0x17287d0 "prepare p1 (date, date) as select * from measurement where logdate between $1 and $2;", params=0x1744e58, queryEnv=0x0, planduration=0x7ffc0dc5c470,  bufusage=0x0) at explain.c:579
#6  0x00000000006d3a35 in ExplainExecuteQuery (execstmt=0x16370a0, into=0x0, es=0x1744b70, queryString=0x1636510 "explain analyze execute p1('2006-04-05', '2006-04-20');",  params=0x0, queryEnv=0x0) at prepare.c:642
#7  0x00000000006a6807 in ExplainOneUtility (utilityStmt=0x16370a0, into=0x0, es=0x1744b70, queryString=0x1636510 "explain analyze execute p1('2006-04-05', '2006-04-20');",  params=0x0, queryEnv=0x0) at explain.c:486
#8  0x00000000006a62da in ExplainOneQuery (query=0x1637368, cursorOptions=2048, into=0x0, es=0x1744b70,  queryString=0x1636510 "explain analyze execute p1('2006-04-05', '2006-04-20');", params=0x0, queryEnv=0x0) at explain.c:375
#9  0x00000000006a5f8b in ExplainQuery (pstate=0x1658dc0, stmt=0x16370d8, params=0x0, dest=0x1658d28) at explain.c:281
#10 0x00000000009935b5 in standard_ProcessUtility (pstmt=0x16375f0, queryString=0x1636510 "explain analyze execute p1('2006-04-05', '2006-04-20');", readOnlyTree=false,  context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0x1658d28, qc=0x7ffc0dc5c9b0) at utility.c:870
#11 0x0000000000992d3e in ProcessUtility (pstmt=0x16375f0, queryString=0x1636510 "explain analyze execute p1('2006-04-05', '2006-04-20');", readOnlyTree=false,  context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, dest=0x1658d28, qc=0x7ffc0dc5c9b0) at utility.c:530
#12 0x0000000000991947 in PortalRunUtility (portal=0x16d6250, pstmt=0x16375f0, isTopLevel=true, setHoldSnapshot=true, dest=0x1658d28, qc=0x7ffc0dc5c9b0) at pquery.c:1158
#13 0x00000000009916b3 in FillPortalStore (portal=0x16d6250, isTopLevel=true) at pquery.c:1031
#14 0x000000000099101c in PortalRun (portal=0x16d6250, count=9223372036854775807, isTopLevel=true, run_once=true, dest=0x16376e0, altdest=0x16376e0, qc=0x7ffc0dc5cb80) at pquery.c:763
#15 0x000000000098ac9f in exec_simple_query (query_string=0x1636510 "explain analyze execute p1('2006-04-05', '2006-04-20');") at postgres.c:1250
#16 0x000000000098f1e0 in PostgresMain (dbname=0x16620d8 "postgres", username=0x16620b8 "mingjie") at postgres.c:4593
#17 0x00000000008cc052 in BackendRun (port=0x1658840) at postmaster.c:4511
#18 0x00000000008cb9eb in BackendStartup (port=0x1658840) at postmaster.c:4239
#19 0x00000000008c7fe8 in ServerLoop () at postmaster.c:1806
#20 0x00000000008c78ba in PostmasterMain (argc=1, argv=0x1630110) at postmaster.c:1478
#21 0x00000000007cdaff in main (argc=1, argv=0x1630110) at main.c:202

ExecInitAppend函数会根据优化器记录的信息,node->part_prune_info:
在这里插入图片描述
来对执行计划进行运行时剪枝:ExecInitPartitionPruning

从上图part_prune_info的结构来看,运行是剪枝和优化器剪枝用的是一套逻辑,都是先走prune step,最后combine,详见上一篇。

问题二:为什么Generic Plan不能剪枝?

Generic Plan是不太参数的计划,也就是只能靠

prepare p1 (date, date) as select * from measurement where logdate between $1 and $2;

生成计划,无法拿到参数也就无法剪枝了。

代码上有什么区别呢?

对比下prune_append_rel_partitions的执行流程区别:

prepare p1 (date, date) as select * from measurement where logdate between $1 and $2;
explain analyze execute p1('2006-04-05', '2006-04-20');

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MariaDB数据库的主从配置

1、前置工作 首先准备两台可以互相ping通的机器&#xff0c;两台机器可以互为主从&#xff0c;示例&#xff1a;10.210.23.77主服务器 10.20.84.183从服务器 2、安装 在两台机器上各自安装数据 解压MariaDB安装包&#xff1b; tar zxvf MariaDB.tgz cd mariadb 安装Mari…

上海市计算机学会竞赛平台比赛组卷

思路&#xff1a;桶排序开出长度为1e55的桶&#xff0c;然后从后向前遍历&#xff0c;对与桶是2的值输出桶的序号即可~~&#xff08;我用的哈希排序&#xff09;~~ 代码&#xff1a; #include <bits/stdc.h>using namespace std; const int N 1e5 5; map<int ,int…

docker 安装sqlserver数据库并开启代理(保姆级)

-目录- 一、安装docker二、安装sqlserver数据库2.1 从 Microsoft 容器注册表中请求 SQL Server 2022 (16.x) Linux 容器映像。2.2 要使用 Docker 运行 Linux 容器映像&#xff0c;可以从 Bash Shell 或提升的 PowerShell 命令提示符使用以下命令2.3 要查看 Docker 容器&#xf…

Linux进程间通信 - 命名管道

在之前的文章中我们讲述了匿名管道的原理的以及对应的简单的两个小例子&#xff0c;在本文中&#xff0c;我们将来继续管道的学习 -- 命名管道。 命名管道 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信。如果我们想在不相关的…

自动化测试如何做?接口自动化测试如何才能做好?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口自动化测试常…

大话设计模式——中介者

5. 中介者&#xff08;Mediator&#xff09; Intent 集中相关对象之间复杂的沟通和控制方式。 Class Diagram Mediator&#xff1a;中介者&#xff0c;定义一个接口用于与各同事&#xff08;Colleague&#xff09;对象通信。Colleague&#xff1a;同事&#xff0c;相关对象…

「轻解压」怎么解?小红书用户画像告诉你

“轻养生”、“轻运动”……一个“轻”字&#xff0c;高度概括了如今年轻人面对生活的态度。今年&#xff0c;「轻解压」成为新的主题词&#xff0c;被广泛提及。 相比传统解压方式&#xff0c;轻解压更讲究愉悦感和生活感。用户通过围观开榴莲、沉浸式收纳等看似与解压毫无关…

MySQL数据库+增删改查

文章目录 MySQL数据库1 基本概念2 数据库系统2.1 操作数据库2.2 分类2.3 常见数据类型 3 SQL语句3.1 DDL3.1.1 创建数据库3.1.2 创建表3.1.3 删除数据库3.1.4 删除表3.1.5 查看所有数据库3.1.6 查看数据表 3.2 DML3.2.1 插入数据3.2.2 删除数据3.2.3 更新数据 3.3 DQL3.3.1 显示…

项目管理专业人员能力评价(CSPM)相关问题汇总,看这篇就够了!

问题导览&#xff1a; 1、国标项目管理&#xff08;项目管理专业人员能力评级&#xff09;证书是什么&#xff1f; 2、国标项目管理&#xff08;项目管理专业人员能力评级&#xff09;证书有几级&#xff1f; 3、项目管理专业人员能力等级证书的价值&#xff08;含金量&#…

2023年年度最佳配色就是它-我已经为大家配好了色卡,还不快来用?

洋红或者又称为胭脂红 今年的「洋红万岁」,PANTONE 称其是[非常规时代的非常规红] 它源自 PANTONE 的红色家族,灵感来自一种叫胭脂虫的小昆虫,在色轮上介于红色和粉红色之间,是天然染料家族中最珍贵的染料之一,也是世界上已知的最浓烈、最明亮的染料之一。 据 PANTONE …

oxygen技术文档编写教程

CSS样式 https://www.oxygenxml.com/doc/versions/24.1/ug-editor/topics/dg-css-stylesheet.html &#xff08;其他参考链接&#xff1a;https://zhuanlan.zhihu.com/p/480000063&#xff09; 插件 https://www.oxygenxml.com/addons.html 官方template https://styles.o…

量子网络商业化的时代来了吗?

光子盒研究院 现在&#xff0c;一个利用量子“纠缠”在遥远的用户之间编织亲密联系的全球网络正在开始形成。 ——田纳西州的这个城市曾推出美国第一个全市范围的千兆比特互联网服务。现在&#xff0c;它将推出全美第一个商业化的量子网络。 2010年&#xff0c;查塔努加市因“成…

双功能螯合剂:MeTz-PEG11-NOTA,甲基四嗪十一聚乙二醇NOTA,试剂有哪些特点?

产品描述&#xff1a; MeTz-PEG11-NOTA&#xff08;甲基四嗪-PEG11-NOTA&#xff09;通过PEG进行连接两端甲基四嗪和NOTA&#xff0c;其中亲水性PEG间隔臂提供了一个长而灵活的连接&#xff0c;一定限度地减少了与含四嗪的复合分子连接有关的空间位阻。NOTA及其衍生物具有良好的…

安装PowerDesigner

安装PowerDesigner&#xff08;文章附上安装所需要的安装包&#xff09; 环境&#xff1a;windows10操作系统、PowerDesigner16.5版 1、双击PowerDesigner16.5安装包进行安装 选择Trial&#xff0c;再点击Next&#xff0c;别选错哈 选择hongkong&#xff0c;并且点击agree …

64G超大容量内存条599,光威天策DDR4 32×2原地起飞

- 光威天策DDR4 64G套装&#xff0c;599元享受极速体验 - 599元升级64G内存&#xff0c;光威天策DDR4给你惊喜 - 光威天策DDR4 64G内存条&#xff0c;简约外观&#xff0c;强劲性能 - 超值618&#xff0c;光威天策DDR4 64G内存条&#xff0c;速度快&#xff0c;散热好 很多热爱…

企业想要搭建CRM平台该如何操作?

如今&#xff0c;企业数字化转型的浪潮依然汹涌。而CRM客户管理平台是企业实现数字化转型&#xff0c;提升市场竞争力的重要工具。那么&#xff0c;企业如何搭建CRM客户管理平台&#xff1f;下面我们就这个问题来说一下。 一、明确业务目标和需求 企业需要明确业务目标&#…

在 Blender、ZBrush 和 Substance 3D Painter 中创建幻想角色

今天瑞云渲染小编给大家带来一篇关于Obafunso Dorgu 作者Serenity 项目背后的工作流程&#xff0c;告诉我们这些衣服是如何在 Marvelous Designer 中制作的&#xff0c;并提到了设置逼真的头发的重要事项。 介绍 大家好&#xff0c;我叫Obafunso Dorgu&#xff0c;我是一名自…

Python+Appium实现自动化测试的使用步骤

这篇文章主要介绍了PythonAppium实现自动化测试的使用步骤&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 一、环境准备 1.脚本语言&#xff1a;Python3.x IDE&am…

【数据分享】1929-2022年全球站点的逐年平均能见度(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到常用的能见度数据&#xff0c;最详细的能见度数据是具体到气象监测站点的能见度数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929…

有趣的数学 对称/非对称加密简史及数学原理一览

一、非对称加密简史 1、算法建立 对于任何想发送加密信息的人&#xff0c;另一个问题是如何让接收人知道这条信息一开始是如何加密的。对于像字母替换式密码这样的密码&#xff0c;问题在于&#xff0c;一旦窃听者知道了加密方案&#xff0c;后续的信息都可以轻松获取。 公钥加…