OceanBase 中的身外身法 —— Auto DOP(自适应并行)使用技巧分享
首先为大家推荐这个 OceanBase 开源负责人老纪的公众号 “老纪的技术唠嗑局”,会持续更新和 OceanBase 相关的各种技术内容。欢迎感兴趣的朋友们关注!
Part 1 背景
前一段儿时间,玩了一下火出天际的《黑神话:悟空》。
不过从第二关的虎先锋开始,游戏难度陡然而增,作为手残玩家,只能靠 “身外身法”,也就是通过吹毫毛召唤一群和玩家一模一样的小猴子来并行攻击敌人。然后就全程重度依赖这个类似于多个 Worker 并行执行玩家指令的法术,一路打到通关。


在 OceanBase 中也有一个和身外身法类似的好东西,叫做 Auto DOP(自适应并行度,DOP:Degree of Parallel),这篇文章就为大家介绍一下这个功能的使用技巧。
Part 2 划重点
先说最重要的结论性的内容:
- Auto DOP 可以在一定程度上,解决需要手动设置并行度的不便。
- 最佳实践很简单,只有两步:
- 先根据机器性能,及可以接受的复杂查询对资源的占用比例,设置并行度上限,例如:
set parallel_degree_limit = 32; - 然后打开 Auto DOP:
set parallel_degree_policy = AUTO;
- 先根据机器性能,及可以接受的复杂查询对资源的占用比例,设置并行度上限,例如:
Part 3 相关参数
接下来为大家介绍几个和 Auto DOP 相关的重要参数,供大家参考:
parallel_servers_target
parallel_servers_target 这个参数是一个租户级系统变量,表示租户在每个节点上可申请的并行执行线程数量。默认值是 MIN CPU * px_workers_per_cpu_quota。
OB 官网文档里对这个参数含义的介绍比较模糊,说是用于设置每个 Server 上的并行查询排队条件。大家可以简单理解成当这个参数指定的线程资源耗尽时,并行执行请求需要排队即可。


parallel_degree_limit
parallel_degree_limit 这个参数是用来限制 Auto DOP 开启时单条 SQL 的最大并行度,默认为 0。当这个参数为 0 时,系统会利用 cpu 和 parallel_servers_target 来限制最大 dop。
例如 parallel_degree_limit = 0 时:
- parallel_servers_target = 10
- min_cpu = 2
- 单条 SQL 查询所读取的两个分区分布在 2 台 OBServer 上
则最大可用 DOP 为 min(10, 2 * 2) = 4。
min_cpu 可以通过 oceanbase.V$OB_UNITS 来查询:


parallel_min_scan_time_threshold
parallel_min_scan_time_threshold 的单位是 ms,当基表的扫描代价高于给参数设定的值时,就会开启并行。能够影响并行度大小。默认值设置为 1000 ms。
通过调小 parallel_min_scan_time_threshold 的值,可以降低对基表开启并行的限制,允许对评估执行时间更小基表扫描开启并行。对已经开启并行且数据量固定的表,也会使用更大的并行度进行扫描。例如:




Part 4 查询是否使用了 Auto DOP
方法一
通过 $OB_PLAN_CACHE_PLAN_STAT 中 OUTLINE_DATA 字段是否包含 PARALLEL(AUTO)。


方法二
通过 explain extended 或 dbms_xplan.display_cursor(这个系统包函数的介绍详见 OceanBase 社区论坛中的这个帖子,强烈推荐大家试用一下)。


Part 5 不同场景的使用建议
AP 场景
如果是纯 AP 场景,要跑少量的复杂大查询,几乎没有需要优先处理的 DML 和小查询,那么 Auto DOP 的使用技巧十分简单:
先根据机器性能,及可以接受的复杂查询对资源的占用比例,设置并行度上限,例如:
set parallel_degree_limit = 32;打开 Auto DOP:
set parallel_degree_policy = AUTO;
AP TP 混布场景
Auto DOP 的目的是优化慢 SQL 的 RT(run time),但是会利用更多的线程资源。这里最大的问题就是会出现少量 AP 大查询和大量 TP 小查询(小 DML)之间的资源争用。AP 慢查询如果通过开 Auto DOP 占用大量线程并行执行,在一定程度上,会影响分配给小查询的资源。
Auto DOP 不是神仙,肯定感知不到用户心中的 SQL 优先级,怎么办?那就需要人告诉数据库,SQL 的优先级是怎样的?
解决方法就是在租户内,让小查询和大查询各有各的资源组,用资源组(resource group)去进行隔离(这里暂且不提另一个被称作大查询队列的东西,在公众号后续的运维技巧内容里会为大家进行介绍)。
OceanBase 在租户内,支持两种粒度的资源隔离,一种是 User 级,一种是 SQL 级。可以通过配置各个 resource group 的 max cpu,让不同 User 或者不同类型的 SQL 使用不同资源组的资源。
Part 6 总结
- 如果需要精细地对 Auto DOP 的并行度进行控制,就需要对控制并行度下限(启用并行执行的起步价 parallel_min_scan_time_threshold)和上限(节点中用于并行执行的线程数上限 parallel_servers_target,以及单条 SQL 中的线程数上限 parallel_degree_limit),根据机器配置和实际需求进行调整。如果不设置,默认就会把尽量多的资源给并行执行去使用(对于纯 AP 场景也许就是最优解)。
- 在同一个租户内,同时存在 AP TP 业务的场景下,可以考虑把 Auto DOP 和资源组绑到一起去用。
️ #老纪的技术唠嗑局 不仅希望能持续给大家带来有价值的技术分享,也希望能和大家一起为开源社区贡献力量。如果你对 OceanBase 开源社区认可,点亮一颗小星星 吧!你的每一个Star,都是我们努力的动力~
https://github.com/oceanbase/oceanbase
OceanBase 中的身外身法 —— Auto DOP(自适应并行)使用技巧分享的更多相关文章
- 深度技术W10系统中绑定MAC地址和IP地址的设置技巧
深度技术W10系统中绑定MAC地址和IP地址的设置技巧分享给大家,感兴趣的用户,请一起来了解下,以备以后作参考,具体如下:1.点击“开始——搜索”,输入CMD命令,然后在CMD上右键选择以管理员身份运 ...
- 关于oceanbase中存储过程的设计与实现
转自http://www.zhujuncoding.com/index.php/Index/blogview?id=82 这篇文章是关于在淘宝的数据库oceanbase中添加存储过程支持的文章,oce ...
- IntelliJ IDEA中出现could not auto wired错误提示处理方式
IntelliJ IDEA中出现could not auto wired错误提示处理方式 程序可以正常运行,就是出现错误提示: 学习了:http://blog.csdn.net/xlxxybz1314 ...
- C++11中一个使用for+auto时容易发生的bug
C++11中一个使用for+auto时容易发生的bug 一个小坑,那就是忘记在for循环中使用auto时加引用. 例如: for(auto num : nums){ // do some thing ...
- devexpress 中advBandedGridView内容自动换行和调整自适应行高
首先是自动换行,可以创建一个repositoryItemMemoEdit 并绑定到需要换行的列中 再设置一下repositoryItemMemoEdit高度自适应,这样子就完成了自动换行了 repos ...
- ASP中双引号单引号和&连接符使用技巧
ASP中双引号单引号和&连接符使用技巧 一.ASP中处在双引号中的可以是任意的字符.字符串,HTML代码 1.<%response.write ("I am here" ...
- (转)Java中使用正则表达式的一个简单例子及常用正则分享
转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...
- Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9941208.html 主讲人:大石头 时间:2018-11-10 晚上20:00 地点:钉钉群(组织代码 ...
- Android技巧分享——如何用电脑下载在Google play中应用的apk文件
[Android技巧分享系列] 1.Android技巧分享——让官方模拟器和genymotion虚拟机飞起来 2.Android技巧分享——如何用电脑下载在Google play中应用的apk文件 G ...
- [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
[翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...
随机推荐
- go 数组或切片转为字符串
数组转字符串 将 var slice = []int{1, 2, 3, 4},转为 [1,2,3,4] 可以使用 json.Marshal(),这是因为 json 包,会将数组和切片值编码为JSON数 ...
- 编写你的第一个 Django 应用程序,第5部分
本教程从教程 4 停止的地方开始.我们已经构建了一个网络投票应用程序,现在我们将为其创建一些自动化测试. 一.自动化测试简介 1.什么是自动化测试? 测试是检查代码操作的例程. 测试在不同级别运行.一 ...
- 如何让tcxGrid左边显示序号
第一步: 设置cxgrid的属性, OptionsView.Indicator = True 第二步: 写OnCustomDrawIndicatorCell方法 procedure TForm1.cx ...
- Electron 客户端开机自启动
app.setLoginItemSettings 与 auto-launch 对比分析 一.稳定性对比 1. app.setLoginItemSettings 优点:作为Electron官方API,有 ...
- Windows 左ctrl和左alt键互换
reg代码 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyb ...
- SMU Autumn 2024 Trial 1
A. Load Balancing 很明显题意要的就是让我们把每个数往平均值靠,这样就保证最大值-最小值最小 但是当sum%n !=0的时候就说明无法每个数都等于sum/n,所以处理的方法就是,先计算 ...
- 2024 (ICPC) Jiangxi Provincial Contest -- Official Contest
L. Campus 1.首先考虑时间复杂度,因为最多只会有2*k的时间点,所以我们采取的策略是,对这每个时刻,判断有多少扇门是开的,并且考虑这些门到其他点的最短路之和. 2.输入完数据以后,使用dij ...
- 基于UPD的快速局域网聊天室
UPD与TCP对比: UDP是无连接的协议,也不保证可靠交付,只在IP数据报服务之上增加了很少的功能,主要是复用和分用以及差错检测的功能.这适用于要求源主机以恒定速率发送数据,允许网络拥塞时丢失数据, ...
- java基础之线程池
一.线程池:提前创建多个线程存放到集合容器中,其中的线程可以反复使用,减少资源的开销 作用就是:线程执行完一个任务,并不被销毁,而是可以继续执行其他的任务 使用线程池中线程对象的步骤: 1. 创建线程 ...
- zookeeper选主测试
Zookeeper 会维护一个具有层次关系的数据结构,它非常类似于一个标准的文件系统 zookeeper基于目录监听机制来选主,多个客户端节点都可以来对zookeeper上某个目录节点进行监听和注册, ...