OceanBase v4.2 特性解析:Auto DOP

news/2024/5/7 7:33:26

我们常会使用并行执行来缩短查询时间,以满足业务对加速查询的需求。那么,如何确定合适的并行资源量呢?在优化器中,并行资源量可以通过并行度(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.mrgr.cn/p/56133174

相关文章

huggingface模型下载至本地并调用教程

huggingface内有许多预训练模型,可以在线调用模型或者将模型部署至本地,但有时候通过网址调用模型会很慢,有些服务器甚至无法通过网址调用… 那么,正题,如何将huggingface的模型部署至本地呢?其实很简单&am…

重发布的原理及其应用

重发布的作用: 在一个网络中,若运行多种路由协议或者相同协议的不同进程;因为协议之间不能直接沟通计算,进程之间也是独立进行转发和运算的,所以,需要使用重发布来实现路由的共享。 条件 : 1&am…

TimThumb——超好用的 PHP 略缩图裁剪插件

TimThumb 是一个非常简洁方便的、用于裁图的 PHP 程序。只要给它设置一些参数,它就可以生成指定图片的缩略图甚至是直接给指定的网站截图。现在很多 WordPress 主题中,都使用的是 TimThumb 这个 PHP 类库进行缩略图处理。(本博客使用的 Nana 主题中的文章略缩图也是用 TimThu…

Laravel 6 - 第十四章 响应

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

接口自动化测试框架建设的经验与教训

为什么选择这个话题? 一是发现很多“点工”在转型迷茫期都会问一些自动化测试相关的问题,可以说自动化测试是“点工”升级的必经之路;二是Google一下接口自动化测试,你会发现很多自动化测试框架相关的文章,但是大部分…

同旺科技 USB TO SPI / I2C适配器读写24LC256--页写

所需设备: 1、USB 转 SPI I2C 适配器;内附链接 2、24LC256芯片 适应于同旺科技 USB TO SPI / I2C适配器升级版、专业版; 从00地址开始写入64个字节,然后再将64个字节读回; 页写时序: 读时序&#xff1a…

Docker(二)Docker+ server部署极简前端页面

本篇文章介绍如何使用 Dockerserver 将一个极简前端页面进行部署 1.本地运行一个简单的前端页面&#xff0c;再把它部署到服务器上 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&quo…

指令优化:基于大型语言模型的指令算子的进化多目标指令优化

指令优化:基于大型语言模型的指令算子的进化多目标指令优化 摘要 基于指令的语言建模在预训练的语言模型中受到了极大的关注。 提出了一种指令优化方法,将指令生成视为一个进化的多目标优化问题,利用大型语言模型(LLM)来模拟指令运算符,包括变异和交叉。 此外,为这些运算…

探索直播+电商系统中台架构:连接消费者与商品的智能纽带

随着直播电商的崛起&#xff0c;电商行业进入了全新的智能时代。直播形式的互动性和即时性为消费者提供了全新的购物体验&#xff0c;而电商平台则为商品的展示、销售和配送提供了强大的支持。在这一背景下&#xff0c;直播电商系统中台架构成为了连接消费者与商品的智能纽带&a…

【STM32+HAL+Proteus】系列学习教程---串口USART(DMA 方式)定长,不定长收发。

实现目标 1、利用UART实现上位机PC与下位机开发板之间的数据通信 2、学会STM32CubeMX软件关于UART的DMA模式配置 3、具体目标&#xff1a;1、实现串口定长收发数据通信&#xff1b;2、串口不定长收发数据通信。 一、DMA简介 1、什么是DMA? DMA&#xff08;Direct Memory …

yolo-驾驶行为监测:驾驶分心检测-抽烟打电话检测

在现代交通环境中&#xff0c;随着汽车技术的不断进步和智能驾驶辅助系统的普及&#xff0c;驾驶安全成为了公众关注的焦点之一 。 分心驾驶&#xff0c;尤其是抽烟、打电话等行为&#xff0c;是导致交通事故频发的重要因素。为了解决这一问题&#xff0c;研究人员和工程师们…

MySQL索引为什么选择B+树,而不是二叉树、红黑树、B树?

12.1.为什么没有选择二叉树&#xff1f; 二叉树是一种二分查找树&#xff0c;有很好的查找性能&#xff0c;相当于二分查找。 二叉树的非叶子节值大于左边子节点、小于右边子节点。 原因&#xff1a; 但是当N比较大的时候&#xff0c;树的深度比较高。数据查询的时间主要依赖于…

算法学习笔记Day8——回溯算法

本文解决几个问题&#xff1a; 回溯算法是什么&#xff1f;解决回溯算法相关的问题有什么技巧&#xff1f;回溯算法代码是否有规律可循&#xff1f; 一、介绍 1.回溯算法是什么&#xff1f; 回溯算法就是个多叉树的遍历问题&#xff0c;关键在于在前序和后序时间点做一些操作…

wps屏幕录制怎么用?分享使用方法!

数字化时代&#xff0c;屏幕录制已成为我们学习、工作和娱乐中不可或缺的一部分。无论是制作教学视频、分享游戏过程&#xff0c;还是录制网络会议&#xff0c;屏幕录制都能帮助我们轻松实现。WPS作为一款功能强大的办公软件&#xff0c;其屏幕录制功能也备受用户青睐。本文将详…

CentOS-7安装Mysql并允许其他主机登录

一、通用设置&#xff08;分别在4台虚拟机设置&#xff09; 1、配置主机名 hostnamectl set-hostname --static 主机名2、修改hosts文件 vim /etc/hosts 输入&#xff1a; 192.168.15.129 master 192.168.15.133 node1 192.168.15.134 node2 192.168.15.136 node33、 保持服…

day13 ts后端持久层框架(java转ts全栈/3R教室)

简介&#xff1a;如果说TS全栈后端开发最重要的两个框架&#xff0c;除了nestjs就是持久层框架了&#xff0c;这里主要看下Typeorm&#xff08;java中常用的就是mybatis&#xff0c;springdatajpa&#xff0c;hebernite了&#xff09; 先回顾下ORM的概念&#xff1a;ORM就是建…

C# GetField 方法应用实例

目录 关于 C# Type 类 GetField 方法应用 应用举例 心理CT设计题 类设计 DPCT类实现代码 小结 关于 C# Type 类 Type表示类型声明&#xff1a;类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义&#xff0c;以及开放或封闭构造的泛型类型。调用 t…

二叉树的性质

性质一:二叉树的第i层上最多有2^(i-1) 个节点 性质二:深度为k的二叉树最多有2^(k)-1个节点 等比数列求和公式: 直接套进去就得到 2^(k)-1 (结点的度&#xff08;Degree) &#xff1a;结点子树的个数。树的度&#xff1a; 树中结点的最大度数。度为k的树也称为k叉树) 性质三:叶…

Uptime Kuma 使用指南:一款简单易用的站点监控工具

我平时的工作会涉及到监控&#xff0c;而站点是一个很重要的监控项。项目上线后&#xff0c;我们通常会将站点监控配置到云平台上&#xff0c;以检测各站点的连通性。但随着项目不断增多&#xff0c;云平台上的配额就有点捉急了。针对这个情况&#xff0c;我们可以试试这个开源…

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色

CSS画一条虚线,并且灵活设置虚线的宽度和虚线之间的间隔和虚线的颜色。 先看效果图&#xff1a; 在CSS中&#xff0c;你可以使用border属性或者background属性来画一条虚线。以下是两种常见的方法&#xff1a; 方法一&#xff1a;使用border属性 你可以设置一个元素的border…