OceanBase 并行执行参数 parallel_servers_target 理解

为了最大程度降低 PX 使用难度,OceanBase 3.1 版起,parallel_max_servers 参数废弃。
用户只需用好 parallel_servers_target 即可。

target 的用途

用一个酒吧的例子来粗略理解下 parallel_servers_target 的意思:

target 先生开了一个酒吧。来这个酒吧里喝酒的都是一群一群的人。酒吧最多容纳100个人 (parallel_servers_target = 100)。

如果酒吧里面一个人都没有(比如刚刚开门),那么来的第一群人总是让他们进去,并且:

  • 如果他们的人数多于100人,则放100人进去。
  • 如果小于100人,例如 30 个人( /*+ parallel(30) */),则有多少放进去多少。

如果酒吧里已经有人在喝酒了,那么新来的一群人,target 会数一数:

  • 如果进去后酒吧装不下,则不让他们进去。
  • 反之,只要装得下,就放进去。

通过这种方式,target 先生可以保证:

  1. 酒吧不会空闲:即使来的每一群人都超过100人,他也有生意做。
  2. 酒吧不会太挤:他的策略可以保证酒吧里的人总是不会超过100人。

真实线程数计算

最简单的 select 场景

select /*+ parallel(30) */ * from t1;

假设 parallel_servers_target = 100, /*+ parallel(30) */,那么会启动 30 个线程来执行 SQL。

多个 dfo 的复杂场景

select /*+ parallel(30) / count() from t1, t2 group by t1.c1, t2.c1;

假设 parallel_servers_target = 100, /*+ parallel(30) */,那么一般来说会启动 60 个线程来执行 SQL。下面的 dfo 使用 30 个线程,上面的 dfo 使用 30 个线程,他们之间形成 producer-consumer 关系。

target 相对较小的场景

select /*+ parallel(30) */ * from t1;

假设 parallel_servers_target = 10, /*+ parallel(30) */,那么会启动 10 个线程来执行 SQL,而不是启动 30 个线程来执行 SQL!

复杂 SQL里,假设 parallel_servers_target = 10, /*+ parallel(30) */,那么会启动 10 个线程来执行 SQL,并且下面的 dfo 使用 5 个线程,上面的 dfo 使用 5 个线程(并不是每个 dfo 使用 10 个线程,没那么多资源)

更特殊的场景

  1. 某些计划形态,会同时调度 3 个 dfo 起来,假设 parallel_servers_target = 12, /*+ parallel(30) */,那么 dfo1 使用 4 个线程,dfo2 使用 4 个线程,dfo3 使用 4 个线程。
  2. 某些 dfo 只能用一个线程执行(计划上会有 local 标记,如2阶段聚集计算的第二阶段),线程的分配就更复杂了

复杂例子

update /*+ parallel(10) enable_parallel_dml */ lyqtest1 t1 set t1.num = (select num from lyqtest t2 where t2.num=3) + t1.num where pk_id < (select max(num) from lyqtest1) +1000========================================================================================================
|ID|OPERATOR                                              |NAME                        |EST. ROWS|COST |
--------------------------------------------------------------------------------------------------------
|0 |PX COORDINATOR                                        |                            |999      |38008|
|1 | EXCHANGE OUT DISTR                                   |:EX10004                    |999      |31276|
|2 |  INDEX INSERT                                        |LYQTEST1(INDEX_LYQ1)        |999      |30603|
|3 |   EXCHANGE IN DISTR                                  |                            |999      |30465|
|4 |    EXCHANGE OUT DISTR (PKEY HASH)                    |:EX10003                    |999      |29792|
|5 |     MATERIAL                                         |                            |999      |29119|
|6 |      INDEX DELETE                                    |LYQTEST1(INDEX_LYQ1)        |999      |28577|
|7 |       EXCHANGE IN DISTR                              |                            |999      |28439|
|8 |        EXCHANGE OUT DISTR (PKEY HASH)                |:EX10002                    |999      |27766|
|9 |         MATERIAL                                     |                            |999      |27093|
|10|          UPDATE                                      |                            |999      |26551|
|11|           EXCHANGE IN DISTR                          |                            |999      |26413|
|12|            EXCHANGE OUT DISTR (PKEY HASH)            |:EX10001                    |999      |25740|
|13|             MATERIAL                                 |                            |999      |19008|
|14|              SUBPLAN FILTER                          |                            |999      |13593|
|15|               MATERIAL                               |                            |999      |13451|
|16|                PX COORDINATOR                        |                            |999      |8035 |
|17|                 EXCHANGE OUT DISTR                   |:EX20002                    |999      |1303 |
|18|                  MATERIAL                            |                            |999      |630  |
|19|                   NESTED-LOOP JOIN                   |                            |999      |88   |
|20|                    EXCHANGE IN DISTR                 |                            |1        |16   |
|21|                     EXCHANGE OUT DISTR (BC2HOST)     |:EX20001                    |1        |15   |
|22|                      SUBPLAN SCAN                    |VIEW1                       |1        |13   |
|23|                       SCALAR GROUP BY                |                            |1        |13   |
|24|                        SUBPLAN SCAN                  |VIEW2                       |1        |13   |
|25|                         LIMIT                        |                            |1        |13   |
|26|                          EXCHANGE IN MERGE SORT DISTR|                            |1        |13   |
|27|                           EXCHANGE OUT DISTR         |:EX20000                    |1        |12   |
|28|                            LIMIT                     |                            |1        |12   |
|29|                             PX PARTITION ITERATOR    |                            |1        |11   |
|30|                              TABLE SCAN              |LYQTEST1(INDEX_LYQ1,Reverse)|1        |11   |
|31|                    PX PARTITION ITERATOR             |                            |999      |93   |
|32|                     TABLE SCAN                       |T1                          |999      |79   |
|33|               EXCHANGE IN DISTR                      |                            |1        |5    |
|34|                EXCHANGE OUT DISTR                    |:EX10000                    |1        |4    |
|35|                 PX BLOCK ITERATOR                    |                            |1        |4    |
|36|                  TABLE SCAN                          |T2                          |1        |4    |
========================================================================================================Outputs & filters: 
-------------------------------------0 - output(nil), filter(nil)1 - output(nil), filter(nil), dop=102 - output(nil), filter(nil), columns([{LYQTEST1: ({INDEX_LYQ1: (T1.NUM, T1.PK_ID, T1.__pk_increment)})}]), partitions(p[0-2]), conv_exprs([column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)], [T1.PK_ID], [T1.__pk_increment])3 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)], [PARTITION_ID]), filter(nil)4 - (#keys=1, [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)]), output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)], [PARTITION_ID]), filter(nil), dop=105 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)]), filter(nil)6 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)]), filter(nil), table_columns([{LYQTEST1: ({INDEX_LYQ1: (T1.NUM, T1.PK_ID, T1.__pk_increment)})}])7 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)], [PARTITION_ID]), filter(nil)8 - (#keys=1, [T1.NUM]), output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)], [PARTITION_ID]), filter(nil), dop=109 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)]), filter(nil)10 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)]), filter(nil), table_columns([{LYQTEST1: ({LYQTEST1: (T1.PK_ID, T1.__pk_increment, T1.NUM, T1.NAME, T1.MONEY)})}]),update([T1.NUM=column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)])11 - output([T1.PK_ID], [T1.__pk_increment], [T1.NUM], [T1.NAME], [T1.MONEY], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)], [PARTITION_ID]), filter(nil)12 - (#keys=1, [T1.PK_ID]), output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)], [T1.NAME], [T1.MONEY], [PARTITION_ID]), filter(nil), is_single, dop=113 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [column_conv(NUMBER,PS:(38,0),NOT NULL,? + T1.NUM)], [T1.NAME], [T1.MONEY]), filter(nil)14 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [?], [T1.NAME], [T1.MONEY]), filter(nil), exec_params_(nil), onetime_exprs_([subquery(1)]), init_plan_idxs_(nil)15 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [T1.NAME], [T1.MONEY]), filter(nil)16 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [T1.NAME], [T1.MONEY]), filter(nil)17 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [T1.NAME], [T1.MONEY]), filter(nil), dop=1018 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [T1.NAME], [T1.MONEY]), filter(nil)19 - output([T1.NUM], [T1.PK_ID], [T1.__pk_increment], [T1.NAME], [T1.MONEY]), filter(nil), conds(nil), nl_params_([VIEW1.MAX(NUM) + 1000])20 - output([VIEW1.MAX(NUM)]), filter(nil)21 - output([VIEW1.MAX(NUM)]), filter(nil), is_single, dop=122 - output([VIEW1.MAX(NUM)]), filter(nil), access([VIEW1.MAX(NUM)])23 - output([T_FUN_MAX(VIEW2.NUM)]), filter(nil), group(nil), agg_func([T_FUN_MAX(VIEW2.NUM)])24 - output([VIEW2.NUM]), filter(nil), access([VIEW2.NUM])25 - output([LYQTEST1.NUM]), filter(nil), limit(1), offset(nil)26 - output([LYQTEST1.NUM]), filter(nil), sort_keys([LYQTEST1.NUM, DESC])27 - output([LYQTEST1.NUM]), filter(nil), dop=1028 - output([LYQTEST1.NUM]), filter(nil), limit(1), offset(nil)29 - output([LYQTEST1.NUM]), filter(nil)30 - output([LYQTEST1.NUM]), filter(nil), access([LYQTEST1.NUM]), partitions(p[0-2]), limit(1), offset(nil)31 - output([T1.PK_ID], [T1.NUM], [T1.__pk_increment], [T1.NAME], [T1.MONEY]), filter(nil)32 - output([T1.PK_ID], [T1.NUM], [T1.__pk_increment], [T1.NAME], [T1.MONEY]), filter(nil), access([T1.PK_ID], [T1.NUM], [T1.__pk_increment], [T1.NAME], [T1.MONEY]), partitions(p[0-2])33 - output([T2.NUM]), filter(nil)34 - output([T2.NUM]), filter(nil), dop=1035 - output([T2.NUM]), filter(nil)36 - output([T2.NUM]), filter([T2.NUM = 3]), access([T2.NUM]), partitions(p0)

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【中科蓝讯BT896X】app.lst、ram.ld、map.txt文件的分析和使用

【中科蓝讯BT896X】app.lst、ram.ld、map.txt文件的分析和使用 测试SDK版本&#xff1a;《SDK_BT896X_S12685_20240314》 文章目录 【中科蓝讯BT896X】app.lst、ram.ld、map.txt文件的分析和使用前言一、app.lst、ram.ld、map.txt文件介绍1.1 app.lst文件1.2 ram.ld文件1.3 map…

【FPGA项目】bin文件ram存取回环测试

&#x1f389;欢迎来到FPGA专栏~bin文件ram存取回环测试 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大…

探秘大数据信用报告:最佳查询方式

大数据信用报告查询方式一般有几种?哪种比较好?在了解这个问题之前&#xff0c;想必你对大数据信用与人行信用的区别都是比较清楚了&#xff0c;本文呢就着重讲一下大数据信用报告查询方式有几种&#xff0c;哪种比较好&#xff0c;感兴趣的朋友不妨一起去看看。 大数据信用报…

跟卖五种常用采集方式,关键词采集升级,更加让新手上手更快!

今天给大家分享一个跟卖选品软件&#xff0c;相信很多卖家都在为选品而苦恼&#xff0c;人工筛选一天也筛选不出几个能用的链接&#xff0c;不仅耗费时间精力&#xff0c;还提升不了选品效率&#xff0c;今天就分享一款实用的选品工具&#xff0c;它能够帮助我们节省选品时间&a…

诊所管理系统哪家会好一点

随着医疗行业的快速发展和信息化进程的加速&#xff0c;诊所作为医疗服务的重要基层单位&#xff0c;其运营管理效率与服务质量的提升愈发依赖于现代化的管理工具。诊所管理系统应运而生&#xff0c;旨在通过集成化、智能化的技术手段&#xff0c;帮助诊所实现诊疗流程优化、资…

Python 显示笔记本电脑的电池状态和百分比

方法一&#xff1a; import psutil import psutil battery psutil.sensors_battery() if battery is None:print("No battery is found.")exit() print (battery) percentagebattery.percent print(f"Battery Percentage: {percentage}%")Battery的信息…

『大模型笔记』缩放定律(scaling laws)是由记忆而非智力解释的吗?

MAC 文章目录 一. 缩放定律(scaling laws)是由记忆而非智力解释的吗?1. 视频原文内容2. 要点总结一般智能的定义规模最大化的论点性能衡量的方式及其影响大语言模型的基准测试大语言模型的本质与记忆基准测试插值的概念与基准测试实例人类和模型的推理与样本效率二. 参考文献一…

期末测试2--函数题---指针链表如何输出?

总结写代码时候遇到的问题 1.遍历指针链表 指针head在做for循环遍历的时候 for&#xff08;head, head!NULL;head&#xff09; head不能 for(head,head!NULL;headhead->next)-------正确的写法 int i; for(ihead;head!NULL;headhead->next) i 是 int 类型的&#x…

chrome浏览器设置--disable-web-security解决跨域

在开发人员于后台进行接口测试的时候&#xff0c;老是遇到跨域问题&#xff0c;这时前端总是会让后台添加跨域请求头来允许跨域请求&#xff0c;今天介绍一个简单的方法跨过这一步操作的设置。 –disable-web-security参数&#xff0c;禁用同源策略&#xff0c;利于开发人员本…

嵌入式系统复习(一)

第一章 嵌入式系统的定义、特点 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软件硬件可裁剪&#xff0c;适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 特点&#xff1a;嵌入性 专用性 计算机系统 嵌入式系统典型组成…

[Shell编程学习路线]——探讨Shell中变量的作用范围(export)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月14日10点14分 &#x1f004;️文章质量&#xff1a;95分 文章目录 ————前言———— 定义变量&#xff1a; 输出变…

【Mars3d】config.json中的蓝色底图map.basemap = 2017代码实现

本身的地图效果&#xff1a; Mars3d的蓝色地图效果&#xff1a; 关键代码&#xff1a; basemaps: [{name: "高德电子",icon: "img/basemaps/gaode_vec.png",type: "gaode",layer: "vec",show: true,invertColor: true,filterColor: &q…

LLM 大模型学习:数据预处理、模板设计以

在模型训练过程中&#xff0c;数据及数据处理是最为重要的工作之一。在当前模型训练流程趋于成熟的情况下&#xff0c;数据集的好坏&#xff0c;是决定了该次训练能否成功的最关键因素。 在上一篇中&#xff0c;我们提到了模型训练的基本原理是将文字转换索引再转换为对应的向…

机器学习python实践——数据“相关性“的一些补充性个人思考

在上一篇“数据白化”的文章中&#xff0c;说到了数据“相关性”的概念&#xff0c;但是在统计学中&#xff0c;不仅存在“相关性”还存在“独立性”等等&#xff0c;所以&#xff0c;本文主要对数据“相关性”进行一些补充。当然&#xff0c;如果这篇文章还能入得了各位“看官…

【React】Lodash---groupBy() 分组

例子 _.groupBy([6.1, 4.2, 6.3], Math.floor); // > { 4: [4.2], 6: [6.1, 6.3] }// The _.property iteratee shorthand. _.groupBy([one, two, three], length); // > { 3: [one, two], 5: [three] }思路分析 来源 定义一个名为groupBy的方法&#xff0c;通过扩展Ar…

OpenAI最强大模型ChatGPT-4o,论文降重小技巧,国内直接使用

一、万字论文&#xff0c;从0到1&#xff0c;只需1小时 通过OpenAI5月14日1点发布的最新大模型ChatGPT4o&#xff1a; 1小时即可完成万字论文的编写通过GPT定制的降重大模型“中文论文降重”&#xff0c;2小时即可完成一篇优质的、查重率较低的万字论文。 在ChatGPT4o对话框中…

【全开源】多功能投票小程序源码(Uniapp+ThinkPHP+FastAdmin)

&#x1f4a5;**【热门推荐】多功能投票小程序&#xff0c;一键解决你的选择难题&#xff01;**&#x1f4a5; 基于ThinkPHPFastAdminUniapp开发的多功能系统&#xff0c;支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、…

[UUCTF 2022 新生赛]爱丽丝梦境的兔子(古典密码)

题目&#xff1a; U2FsdGVkX19ixL7s5HryOhyL5oSScYGNVBVWlsUMYQwTRniXreqeSp/iTHtkcxt qicNL4xpHc5X34Daat7ixqkZMpU4JV9USOKKTAw9HJfGnoDzFF/JY0gzJpxgmW1X 4nXktQ4J7OM14EMcTrhPDIOfG2VDJr4yViWc/vNS8np1IFeIRXMoWGAJHuI8IOVG tXi2JX6hTseYkJc2LGHJkLQ0WDW67RyhPC3vOwmJHOs/w…

TF-IDF算法:从文本中发现价值的黄金法则

TF-IDF算法 一、简介二、TF-IDF算法原理2.1 词频&#xff08;TF&#xff09;2.2 逆文档频率&#xff08;IDF&#xff09;2.3 TF-IDF的计算 三、TF-IDF算法应用3.1 搜索引擎3.2 文本分类3.3 信息提取3.4 文本摘要 四、TF-IDF算法的改进4.1、TF-IDF算法的改进4.1.1. 基于词的权重…

OpenGL3.3_C++_Windows(8)

材质&&漫反射&#xff0c;光照贴图 使用struct为材质建立结构体&#xff0c;以便方便管理漫反射贴图是物体的颜色值&#xff08;纹理&#xff09;&#xff08;通过 UV 坐标映射到渲染物体的表面&#xff09;&#xff0c;材质是物体的属性&#xff08;物体对光的交互&a…