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 DOPset global parallel_degree_policy = AUTO;-- 在 session 级别启用 Auto DOPset session parallel_degree_policy = AUTO;set parallel_degree_policy = AUTO;-- 在全局级别禁止 Auto DOPset global parallel_degree_policy = MANUAL;-- 在 session 级别禁止 Auto DOPset session parallel_degree_policy = MANUAL;set parallel_degree_policy = MANUAL;-- 使用 hint 在查询级别启用 Auto DOPselect /*+parallel(auto)*/ * from t1;-- 使用 hint 在查询级别禁止 Auto DOPselect /*+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 策略 DOPset 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 basicselect /*+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.mzph.cn/pingmian/3014.shtml

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

相关文章

前端发送请求,显示超时取消

前端发送请求,显示超时取消 问题说明:后台接口请求60s尚未完成,前端控制台显示取消(canceled) 原因 1、前端设置60s超时则取消 2、后台接口响应时间过长,过长的原因统计的数据量多(实际也才17…

react项目,文件夹和组件命名,有什么好的规范

在React项目中,文件夹和组件的命名规范对于保持代码的可读性和可维护性至关重要。以下是一些建议的规范: 文件夹命名规范 1、使用小写字母: 所有文件夹名称都应使用小写字母,避免使用大写字母或特殊字符。 2、使用短而描述性的…

LLM 安全 | 大语言模型应用安全入门

一、背景 2023年以来,LLM 变成了相当炙手可热的话题,以 ChatGPT 为代表的 LLM 的出现,让人们看到了无限的可能性。ChatGPT能写作,能翻译,能创作诗歌和故事,甚至能一定程度上做一些高度专业化的工作&#x…

BUUCTF-Misc20

[ACTF新生赛2020]NTFS数据流1 1.打开附件 是一堆文件,随便打开一个内容是flag不在这 2.pyton脚本 编写查找文件夹下一堆文件中那个文件藏有flag的Python脚本 import os def search_flag_files(folder_path, flag): flag_files [] for root, dirs, files …

HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程

HAL STM32 SSI/SPI方式读取MT6701磁编码器获取角度例程 📍相关篇《HAL STM32 I2C方式读取MT6701磁编码器获取角度例程》📌当前最新MT6701数据手册:https://www.magntek.com.cn/upload/MT6701_Rev.1.8.pdf📜SSI协议读角度&#xff…

【stomp实战】搭建一套websocket推送平台

前面几个小节我们已经学习了stomp协议,了解了stomp客户端的用法,并且搭建了一个小的后台demo,前端页面通过html页面与后端服务建立WebSocket连接。发送消息给后端服务。后端服务将消息内容原样送回。通过这个demo我们学习了前端stomp客户端的…

剑指 Offer 03.:数组中重复的数字

剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。…

DIN特征加权、POSO特征增强、SENET特征选择

本文转自:DIN、POSO、SENet 聊聊推荐模型中常用的Attention-腾讯云开发者社区-腾讯云 一、前言 聊起模型结构的时候,经常听做推荐的同学说: "这里加了个self-attention" "类似于一个SENet" "一个魔改的POSO"…

第6章 Mybatis高级查询(详解篇)

第6章 Mybatis高级查询_详解篇 1. 一对一映射1.1 自动映射(关联的嵌套结果映射)1.2 使用 resultMap 配置一对一映射resultMap复用1.3 association 标签的嵌套结果映射resultMap复用1.4 association标签的嵌套查询结构分析嵌套查询加载方式延迟记载注意事项延迟记载:利用@Respon…

[Visual Studio 报错] error 找不到指定的 SDK“Microsoft

[Visual Studio 2022 报错] error : 找不到指定的 SDK“Microsoft.NET.Sdk.Web” 问题描述: 在新电脑上安装了VS2022,打开现有项目的解决方案后的时候报了这个错,所有projet文件都加载失败,如图所示: 报错分析及解决 打开项目配…

经验丰富也被裁了,失业快2年找不到工作?

前几天徐工说,他有个邻居,最近逮到他总是要跟他扯上几句。 原因是徐工一直是做嵌入式开发,而他一直做纯软件开发,具体不知道做后端还是前端。 他说,他至少有半年没上班了,之前在一家龙头物流公司上班。 碰上…

Netty websocket配置wss

录音配置https 导致ws连不上 Slf4j Component public class NettyServer {/*** 启动** throws InterruptedException*/private void start() throws InterruptedException {bossGroup new NioEventLoopGroup();workGroup new NioEventLoopGroup();ServerBootstrap bootstrap…

STM32 HAL库F103系列之DAC实验(二)

DAC输出正弦波实验 实验简要 1,功能描述 通过DAC1通道1(PA4)输出正弦波,然后通过DS100示波器查看波形 2,使用定时器7 TRGO事件触发转换 TEN1位置1、TSEL1[2:0]010 3,关闭输出缓冲 BOFF1位置1 4,使用DMA模式 DMAE…

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略

SLMs之Phi-3:Phi-3的简介、安装和使用方法、案例应用之详细攻略 导读:2024年4月23日,微软发布Phi-3,这是微软推出的一款新的开源AI模型家族Phi-3。背景痛点:小语言模型(SLM)尽管规模不大,但在语言理解、代码…

盲盒商城小程序(有米就出)

一款前端采用uniapp,后端采用Django框架开发的小程序,包含后台管理,如有人需要可联系演示功能(个人开发,可商用/学习)。 部分截图如下:

设备驱动-随记

1. dma_alloc_coherent函数是用于在Linux内核中为设备驱动程序分配用于DMA操作的内存区域的函数。DMA是指通过外部设备直接访问系统内存的过程,它通常用于设备之间的数据传输,比如网络数据包的接收和发送,磁盘I/O等。 这个函数在linux/dma-…

【刷题】C++ 版刷题指南

C 刷题指南(自用) 小tips:includestruct节点io输入输出练习其它 库输入迭代器stringvectordeque(双端队列)优先队列priority\_queue优先队列 tuple优先队列 结构体(自定义排序) mapsetpairtup…

文件摆渡:安全、高效的摆渡系统助力提升效率

很多组织和企业都会通过网络隔离的方式来保护内部的数据,网络隔离可以是物理隔离,也可以是逻辑隔离,如使用防火墙、VPN、DMZ等技术手段来实现,隔离之后还会去寻找文件摆渡方式,来保障日常的业务和经营需求。 进行网络隔…

Python的一些高级用法

Python的高级用法涵盖了更深入的编程技巧、设计模式、并发编程、性能优化等方面。以下是Python的一些高级用法: 1.装饰器 用于修改函数或类的行为的函数,常用于日志记录、性能分析等。 def my_decorator(func):def wrapper():print("Something i…

数据库变更时,OceanBase如何自动生成回滚 SQL

背景 在开发中,数据的变更与维护工作一般较频繁。当我们执行数据库的DML操作时,必须谨慎考虑变更对数据可能产生的后果,以及变更是否能够顺利执行。若出现意外数据丢失、操作失误或语法错误等情况,我们必须迅速将数据库恢复到变更…