OceanBase v4.2 特性解析:Auto DOP

我们常会使用并行执行来缩短查询时间,以满足业务对加速查询的需求。那么,如何确定合适的并行资源量呢?在优化器中,并行资源量可以通过并行度(DOP:Degree of Parallelism)这来衡量。在实际业务场景中,是否启用并行执行以及设置多大,往往需要根据查询的实际执行情况、业务需求,结合经验来做出决策。

在人为指定并行度时,可以通过系统变量对当前会话中的所有执行查询开启并行,并指定并行度。然而,这对会话中本不需要并行加速或无需使用较高 DOP 的查询带来额外的并行执行开销,从而导致性能下降。另一方面,可以通过 hint 的方式来指定特定查询的并行度,但这需要对每一条业务查询进行单独考量,对于存在大量业务查询的情况,是不可行的。

为了解决人为指定并行度的不便和限制,查询优化器可以通过Auto DOP功能在生成查询计划时,评估查询需要执行的时间,自动确定是否开启并行和开启适量的并行度。这样可以避免由于人工指定并行度不当而导致的性能下降。

开启 Auto DOP

优化器的 DOP 选择策略目前分为 AUTO 模式和 MANUAL 模式。AUTO 模式下优化器可以根据查询实际情况,自动选择开启并行,并确定并行度。MANUAL 模式仅能通过人为干预开启并行。

优化器的 DOP 选择策略有两种控制方式,可以通过系统变量 parallel_degree_policy 进行全局或 session 级别的 DOP 选择策略配置,也通过更高优先级的 hint 进行查询级别的 DOP 选择策略配置。具体配置方法如下:

-- 在全局级别启用 Auto DOP
 set global parallel_degree_policy = AUTO;
 -- 在 session 级别启用 Auto DOP
 set session parallel_degree_policy = AUTO;
 set parallel_degree_policy = AUTO;
 
 -- 在全局级别禁止 Auto DOP
 set global parallel_degree_policy = MANUAL;
 -- 在 session 级别禁止 Auto DOP
 set session parallel_degree_policy = MANUAL;
 set parallel_degree_policy = MANUAL;
 
 -- 使用 hint 在查询级别启用 Auto DOP
 select /*+parallel(auto)*/ * from t1;
 -- 使用 hint 在查询级别禁止 Auto DOP
 select /*+parallel(manual)*/ * from t1;
 select /*+parallel(8)*/ * from t1;  

在 OceanBase 4.2 版本中,parallel_degree_policy 默认设置为 MANUAL。

Auto DOP 相关设置

在 Auto DOP 策略下,有两个相关的变量会影响获取的 DOP 大小。

变量 parallel_degree_limit 限制 Auto DOP 策略时允许使用的最大 DOP,parallel_degree_limit 缺省值为 0,使用缺省值时,使用下面两种方法得到的较小值限制最大 DOP:

1.     变量 parallel_servers_target 的设置值。

2.     利用租户 unit 的 min cpu 与读取表的 server 数量相乘得到限制值。

如 parallel_degree_limit = 0,parallel_servers_target = 10, min_cpu = 2, 下方查询读取的两个分区分布在两台 observer 上,则最大可用 DOP 为 min(10, 2*2) = 4
select * from t1 partition (p0, p1);
min_cpu 可以通过 select min_cpu from oceanbase.V$OB_UNITS; 查询

变量 parallel_min_scan_time_threshold 是在 Auto DOP 策略中用于计算并行度的参数,表示对基表扫描开启并行的参考执行时间。当基表扫描评估执行时间超过这个设定值时,会对基表扫描开启并行,并利用这个设定值计算一个合适的并行度。变量默认值设置为 1000,单位毫秒。通过调小 parallel_min_scan_time_threshold 的值,可以降低对基表开启并行的门限制,允许对评估执行时间更小基表扫描开启并行,对已经开启并行且数据量固定的表,也会使用更大的并行度进行扫描。

-- 设置 global/session 级别 Auto DOP 策略最大 DOP 限制
 set global parallel_degree_limit = 64;
 set session parallel_degree_limit = 64;
 set parallel_degree_limit = 64;
 
 -- 设置 global/session 级别 Auto DOP 策略 DOP
 set global parallel_min_scan_time_threshold = 100;
 set session parallel_min_scan_time_threshold = 100;
 set parallel_min_scan_time_threshold = 100;  

Auto DOP 与其它并行开启方式关系

对于开启并行的多种方式,优先级关系详见官网文档并行开启方式及优先级。

开启 Auto DOP 后,优化器可以对 select/delete/update/insert 等多种操作开启并行,对于 delete/update/insert 等数据维护操作,开启并行后会自动使用 PDML,不需要再对 _enable_parallel_dml 进行配置打开 PDML。

Auto DOP 使用场景

Auto DOP 可以对查询主动开启并行,但使用并行度的大小受到一些配置项的影响,在不同场景下使用 Auto DOP 需要对相关参数进行一些调整。

场景1:查询性能极致优化

当数据库没有其它查询负载时,想要利用租户下所有并行执行资源获得极致查询性能时,可以将 Auto DOP 开启并行的参考执行时间设到最低,同时不主动对 Auto DOP 使用的最大 DOP 进行限制。此时将相关参数进行以下设置:
set parallel_degree_policy = AUTO;
 set parallel_degree_limit = 0;
 set parallel_min_scan_time_threshold = 10;  

场景2:系统性能优化

当数据库大量并发查询负载时,大量查询使用较高 DOP 会导致系统并行资源不足,导致查询队列排队等问题。为了避免大量大并行度查询对系统资源的占用,可以对查询机制性能优化中的参数进行调整:

a. 将 parallel_degree_limit 设置为小于系统 CPU 数的某个数值,限制 Auto DOP 使用的最大 DOP;

b. 将 parallel_min_scan_time_threshold 调大,整体降低大量查询使用的并行度。

如限制最大使用 DOP = 32 、对基表扫描评估时间超过20ms的查询开启并行的参数设置如下:

set parallel_degree_policy = AUTO;
 set parallel_degree_limit = 32;
 set parallel_min_scan_time_threshold = 20;  

Auto DOP 策略下 DOP 的获取

Auto DOP 策略下首先通过一定算法确定基表扫描算子使用的 DOP(通过对不同并行度下基表扫描执行时间进行估计,综合 parallel_min_scan_time_threshold 和最大允许 DOP 得到,其它算子的 DOP 在计划生成的过程中,通过继承孩子算子的 DOP 获取。

如下方查询,表 tp1、tp2 插入一定规模数据后,使用 Auto DOP 策略,同时指定两表的连接顺序、分布式连接方法。对于表 A、B 使用 Auto DOP 策略,获取并行度为 DOP = 4、DOP = 8。两表使用 HASH HASH 的分布式连接方法后,HASH JOIN 算子的并行度通过继承得到,使用了左右两个孩子算子中较大并行度 DOP = 8。

create table tp1(c1 int, c2 int, c3 int) partition by hash(c1) partitions 4;
 create table tp2(c1 int, c2 int, c3 int) partition by hash(c1) partitions 8;
 explain basic
 select /*+leading(a b) use_hash(a b) pq_distribute(b hash hash) */
 * from tp1 a, tp2 b where a.c1 = b.c1;
 +------------------------------------------------------------------------------------------------+
 | Query Plan                                                                                     |
 +------------------------------------------------------------------------------------------------+
 | ===========================================                                                    |
 | |ID|OPERATOR                     |NAME    |                                                    |
 | -------------------------------------------                                                    |
 | |0 |PX COORDINATOR               |        |                                                    |
 | |1 | EXCHANGE OUT DISTR          |:EX10002|                                                    |
 | |2 |  HASH JOIN                  |        |                                                    |
 | |3 |   EXCHANGE IN DISTR         |        |                                                    |
 | |4 |    EXCHANGE OUT DISTR (HASH)|:EX10000|                                                    |
 | |5 |     PX BLOCK ITERATOR       |        |                                                    |
 | |6 |      TABLE SCAN             |A       |                                                    |
 | |7 |   EXCHANGE IN DISTR         |        |                                                    |
 | |8 |    EXCHANGE OUT DISTR (HASH)|:EX10001|                                                    |
 | |9 |     PX BLOCK ITERATOR       |        |                                                    |
 | |10|      TABLE SCAN             |B       |                                                    |
 | ===========================================                                                    |
 | Outputs & filters:                                                                             |
 | -------------------------------------                                                          |
 |   0 - output([INTERNAL_FUNCTION(A.C1, A.C2, A.C3, B.C1, B.C2, B.C3)]), filter(nil), rowset=256 |
 |   1 - output([INTERNAL_FUNCTION(A.C1, A.C2, A.C3, B.C1, B.C2, B.C3)]), filter(nil), rowset=256 |
 |       dop=8                                                                                    |
 |   2 - output([A.C1], [B.C1], [A.C2], [A.C3], [B.C2], [B.C3]), filter(nil), rowset=256          |
 |       equal_conds([A.C1 = B.C1]), other_conds(nil)                                             |
 |   3 - output([A.C1], [A.C2], [A.C3]), filter(nil), rowset=256                                  |
 |   4 - output([A.C1], [A.C2], [A.C3]), filter(nil), rowset=256                                  |
 |       (#keys=1, [A.C1]), dop=4                                                                 |
 |   5 - output([A.C1], [A.C2], [A.C3]), filter(nil), rowset=256                                  |
 |   6 - output([A.C1], [A.C2], [A.C3]), filter(nil), rowset=256                                  |
 |       access([A.C1], [A.C2], [A.C3]), partitions(p[0-3])                                       |
 |       is_index_back=false, is_global_index=false,                                              |
 |       range_key([A.__pk_increment]), range(MIN ; MAX)always true                               |
 |   7 - output([B.C1], [B.C2], [B.C3]), filter(nil), rowset=256                                  |
 |   8 - output([B.C1], [B.C2], [B.C3]), filter(nil), rowset=256                                  |
 |       (#keys=1, [B.C1]), dop=8                                                                 |
 |   9 - output([B.C1], [B.C2], [B.C3]), filter(nil), rowset=256                                  |
 |  10 - output([B.C1], [B.C2], [B.C3]), filter(nil), rowset=256                                  |
 |       access([B.C1], [B.C2], [B.C3]), partitions(p[0-7])                                       |
 |       is_index_back=false, is_global_index=false,                                              |
 |       range_key([B.__pk_increment]), range(MIN ; MAX)always true                               |
 +------------------------------------------------------------------------------------------------+  

小结

Auto DOP 提供了对各类 DML 操作自动开启并行的能力,一定程度上解决了依赖手动调整 DOP 的局限性。

Auto DOP 以计算基表最佳并行度为基础,在计划生成过程中根据计划形态不同产生各算子使用的并行度。使用这种策略能够得到相对稳定可靠的并行度,但对于一些特定场景开启的并行度可能偏小,如中间结果集相对基表扫描的数据量急剧膨胀、存在特定性能瓶颈等。

目前 Auto DOP 不具备系统负载感知、动态调整或反馈调整 DOP 的能力,因此使用 Auto DOP 时需要关注数据库的业务场景,针对查询性能极致优化或系统级性能优化对 Auto DOP 几个相关配置项进行调整。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开放式耳机哪个牌子好?热门开放式耳机合集,买前必看!

随着人们对运动健康的重视,越来越多的运动爱好者开始关注如何在运动中享受音乐。开放式蓝牙耳机凭借其独特的设计,成为了户外运动的理想选择。它不仅让你在运动时能够清晰听到周围环境的声音,保持警觉,还能让你在需要时与他人轻松…

08 JavaScript学习:数据类型

JavaScript 数据类型 值类型(基本类型):字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、未定义(Undefined)、Symbol。 引用数据类型(对象类型):对…

插入排序与希尔排序

文章目录 插入排序配图详解核心思想核心代码 源代码运行结果 希尔排序实现逻辑源代码运行结果 插入排序 插入排序在少量数据中是一个高效的算法,你可以想象在打牌的时候,左手是已经整理好的牌,右手是正在抓取的牌。 配图详解 对一组数据 5&…

手机号码空号过滤API:有效验证和过滤无效电话号码

随着移动通信技术的发展,手机号码成为人们日常生活和工作中不可或缺的一部分。然而,随着时间的推移,一些手机号码可能会变成空号,这给企业在进行电话营销和数据分析时带来了一定的困扰。为了解决这个问题,挖数据平台提…

武汉星起航:引领跨境电商新潮流,一站式孵化助力卖家轻松出海

武汉星起航电子商务有限公司,作为跨境电商领域的领军者,始终秉持“走出去”的战略理念,依托自营店铺的丰富经验和对跨境电商资源的深度整合,成功打造了一站式卖家孵化体系。这一体系集开店策划、运营教学、资源服务于一体&#xf…

Linux:常用软件、工具和周边知识介绍

上次也是结束了权限相关的知识:Linux:权限相关知识详解 文章目录 1.yum-管理软件包的工具1.1基本介绍1.2yum的使用1.3yum的周边生态1.4软件包介绍 2.vim-多模式的文本编辑器2.1基本介绍2.2基本模式介绍2.2.1命令模式(Normal mode)…

SpringBoot项目如何实现邮件发送

文章目录 1. 开启邮箱SMTP服务2. 导入pom依赖3. 在配置文件中添加邮箱配置3. 封装EmailTask类4. 写测试类 1. 开启邮箱SMTP服务 这里以163邮箱为例,点击设置——更多设置——POP3/SMTP/IMAP——开启服务 根据提示开启服务之后会得到一个授权码,只显示一…

七牛云配置,图片上传、查看的使用(备忘)

修改配置文档 修改新创建的空间的地区名 访问设置为 公开,不然会有访问时间限制 检查 上传和查看的链接是否正确。

Llama3本地部署实现模型对话

1. 从github下载目录文件 https://github.com/meta-llama/llama3 使用git下载或者直接从github项目地址下载压缩包文件 git clone https://github.com/meta-llama/llama3.git2.申请模型下载链接 到Meta Llama website填写表格申请,国家貌似得填写外国,组织随便填写即可 3.…

STL容器搜索:当直接访问STL容器时,如何执行有效和正确的搜索?

掌握STL容器搜索技巧:在C中实现高效和准确的数据访问 一、简介二、std::vector, std::deque, std::list三、std::map, std::multimap, std::set, std::multiset四、std::string六、总结 一、简介 本文主要了解如何在直接访问c容器时高效地进行搜索。在STL容器中搜索&#xff0…

【PostgreSQL里insert on conflict do操作时的冲突报错分析】

最近在巡检PostgreSQL的数据库的时候,发现部分数据库里存在大量的如下报错 ERROR: ON CONFLICT DO UPDATE command cannot affect row a second time HINT: Ensure that no rows proposed for insertion within the same command have duplicate constrained val…

如何在CentOS本地搭建DataEase数据分析服务并实现远程查看数据分析

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务…

信息系统项目管理师0056:数据管理(4信息系统管理—4.2管理要点—4.2.1数据管理)

点击查看专栏目录 文章目录 4.2管理要点4.2.1数据管理1.数据战略2.数据治理3.数据架构4.数据应用5.数据安全6.数据质量7.数据标准8.数据生存周期9.理论框架与成熟度4.2管理要点 信息系统管理涉及系统准备、设计、实施、运行等活动的众多方面,

基于SpringBoot的在线五子连珠的设计与实现,前端采用vue框架;后端采用SpringBoot,mybatis

介绍 基于SpringBoot的在线五子连珠的设计与实现,主要是设计一款五子棋游戏,涉及登录注册的功能,人机对战、联机对战和积分排行榜的功能。其中人机对战中,电脑采用的是采用了一种基于局面分析的评分算法来确定机器人的下一步落子…

java 红黑树

01.红黑树的定义: 每一个结点有五个属性:

书生浦语大模型实战训练营--第二期第六节--Lagent AgentLego 智能体应用搭建--homework

一、基础作业 1.完成 Lagent Web Demo 使用,并在作业中上传截图 根据以下命令启动成功! 2.完成 AgentLego 直接使用部分,并在作业中上传截图 这是原图 使用AgentLego进行自动目标检测后,很明显图中的物体已经被识别出来了 二、…

ElasticSearch可视化工具:kibana + elasticsearch-head

kibana 下载 地址:https://www.elastic.co/cn/downloads/kibana 下载别的版本:https://www.elastic.co/cn/downloads/past-releases#kibana 将Kibana安装包解压缩 进入config目录,在kibana.yml中添加es服务器地址。(如果之前没…

Latex使用algoritm2e出现的错误汇总(updating)

1. return 和 end在一行 解决办法是:\Return{}中必须使用latex公式,如:\Return{$S_b$}

uniapp全局监听分享朋友圈或朋友

把大象装进冰箱需要几步: 1、创建shart.js文件 export default{data(){return {//设置默认的分享参数//如果页面不设置share,就触发这个默认的分享share:{title:标题,path:/pages/index/index,imageUrl:图片,desc:描述,content:内容}}},onLoad(){let ro…

Android的一些总结

先打开自定义的app显示欢迎->消失 打开桌面应用程序->在桌面应用程序中也要能一键启动打开视频播放的app 桌面应用程序广播接收者进行监听,然后打开服务/activity是可行的。 ########################## 日志,调试: Usb 无线 串口…
最新文章