数仓调优实战:GUC参数调优

1. 前言

  • 适用版本:【8.1.1及以上】

GaussDB(DWS)性能调优系列专题文章,介绍了数据库性能调优的思路和总体策略。在系统级调优中数据库全局的GUC参数对整体性能的提升至关重要,而在语句级调优中GUC参数可以调整估算模型,选择查询计划中算子的类型,或者选择不同的执行计划。因此在SQL调优过程中合理的设置GUC参数十分重要。

2. 优化器GUC参数调优

在GaussDB(DWS)中,SQL语句的执行所需要经历的步骤如下图所示,其中红色部分为DBA可以介入实施调优的环节。

查询计划的生成是基于一定的模型和统计信息进行代码估算,在某些场景由于统计信息不准确或者代价估算有偏差时,就需要通过GUC参数设置的的方式选择更优的查询计划。

在GaussDB(DWS)中,和SQL执行性能相关的GUC参数主要有以下几个:

  • best_agg_plan: 进行聚集计算模型的设置

  • enable_sort: 控制优化器是否使用的排序,主要用于让优化器选择使用HashAgg来实现聚集操作

  • enable_hashagg:控制优化器是否使用HashAgg来实现聚集操作

  • enable_force_vector_engine:开启参数后强制生成向量化的执行计划

  • query_dop:用户自定义的查询并行度

2.1 best_agg_plan参数

GaussDB(DWS)是分布式的数据库集群,数据计算尽量在各个DN上并行计算,可以得到最优的性能,在Stream框架下Agg操作可以分为两个场景。

Agg下层算子输出结果集的分布列是Group By列的子集。

这种场景,直接对下层结果集进行汇聚的结果就是正确的汇聚结果,生成算子直接使用即可。例如以下语句,lineitem的分布列是l_orderkey,它是Group By的列。

select
l_orderkey,
count(*) as count_order
from
lineitem
group by
l_orderkey;

查询计划如下:

Agg下层算子输出结果集的分布列不是Group By列的子集。

对于这种场景Stream下的聚集(Agg)操作,优化器可以生成以下三种形态的查询计划:

  • hashagg+gather(redistribute)+hashagg

  • redistribute+hashagg(+gather)

  • hashagg+redistribute+hashagg(+gather)

通常优化器总会选择最优的执行计划,但是众所周知代价估算,尤其是中间结果集的代价估算有时会有比较大的偏差。这种比较大的偏差就可能会导致聚集(agg)的计算方式出现比较大的偏差,这时候就需要通过best_agg_plan参数进行聚集计算模型的干预。

以下通过TPC-H Q1语句分析三种形态的查询计划:

-- TPC-H Q1
select
l_returnflag,
l_linestatus,
sum(l_quantity) as sum_qty,
sum(l_extendedprice) as sum_base_price,
sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
avg(l_quantity) as avg_qty,
avg(l_extendedprice) as avg_price,
avg(l_discount) as avg_disc,
count(*) as count_order
from
lineitem
where
l_shipdate <= date '1998-12-01' - interval '90' day (3)
group by
l_returnflag,
l_linestatus
order by
l_returnflag,
l_linestatus;
}

当best_agg_plan=1时,在DN上进行了一次聚集,然后结果通过GATHER算子汇总到CN上进行了二次聚集,对应的查询计划如下:

该方法适用于DN第一次聚集后结果集较少并且DN数较少的场景,在CN上进行第二次聚集时的结果集小,CN不会成为计算瓶颈。

当best_agg_plan=2时,在DN上先按照Group By的列进行数据重分布,然后在DN上进行聚集操作,将汇总的结果返回给CN,对应的查询计划如下:

该方法适用于DN第一次聚集后结果集缩减不明显的场景,因为这样可以省略DN上的第一次聚集操作。

当best_agg_plan=3时,在DN上进行一次聚集,然后将聚集结果按照Group By的列进行数据重分布,之后在DN上进行二次聚集得到结果,对应的查询计划如下:

该方法使用于DN第一次聚集后中间结果缩减明显,但最终结果行数比较大的场景。

GaussDB(DWS)中,以上三种方法的选择是根据代价来自动选择。在实际的SQL调优时,如果遇到有聚集方式不合理的场景,可以通过尝试设置best_agg_plan参数,选择最优的聚集方式。

2.2 enable_sort参数

GaussDB(DWS)中实现分组聚集操作有两种方法:

  • HashAgg:使用Hash表对数据进行去重,并同时进行聚集操作,适用于聚集后行数缩减较多的场景。

  • Sort + GroupAgg:首先对数据进行排序,然后遍历排序后的数据,完成去重和聚集操作,适用于聚集后行数缩减较少的场景。

以下面的SQL为例:

select
l_orderkey,
count(*) as count_order
from
lineitem
group by
l_orderkey;

如果使用Sort + GroupAgg的方式,在Sort排序算子里执行时间比较长,因为需要对大量数据进行排序操作。

以上这种场景,可以关闭enable_sort参数,选择使用HashAgg的方式来实现聚集操作,可以获得较好的执行性能。

2.3 enable_hashagg参数

GaussDB(DWS)中通过count distinct来统计多个列的数据时,通常会使用HashAgg来实现每一个列的统计聚集操作,然后将结果通过Join方式关联起来得到最终结果。

以下面的SQL为例:

select
l_orderkey,
count(distinct l_partkey) as count_partkey,
count(distinct l_suppkey) as count_suppkey,
count(distinct l_linenumber) as count_linenumber,
count(distinct l_returnflag) as count_returnflag,
count(distinct l_linestatus) as count_linestatus,
count(distinct l_shipmode) as count_shipmode
from
lineitem
group by
l_orderkey;

从查询计划来看,通过count distinct统计了lineitem表中的6列数据,是通过6个HashAgg操作来实现的,该SQL执行时消耗的资源相对较高。

如果关闭enable_hashagg参数,优化器会选择Sort + GroupAgg的方式,该SQL执行时消耗的资源相对较少。

在应用开发时,可以根据SQL并发和资源使用情况,通过设置enable_hashagg参数来选择合适的执行计划。

2.4 enable_force_vector_engine参数

GaussDB(DWS)支持行存储和列存储两种存储模型,用户可以根据应用场景,建表的时候选择行存储还是列存储表。向量化执行将传统的执行模式由一次一元组的模型修改为一次一批元组,配合列存特性,可以带来巨大的性能提升。

如果使用行存表或者是行列混存的场景,由于行存表默认走的是行存执行引擎,最终查询无法走向量化执行引擎。

以下面的SQL为例:

select
l_orderkey,
sum(l_extendedprice * (1 - l_discount)) as revenue,
o_orderdate,
o_shippriority
from
customer_row,
orders,
lineitem
where
c_mktsegment = 'BUILDING'
and c_custkey = o_custkey
and l_orderkey = o_orderkey
and o_orderdate < date '1995-03-15'
and l_shipdate > date '1995-03-15'
group by
l_orderkey,
o_orderdate,
o_shippriority
order by
revenue desc,
o_orderdate
    limit 10;

SQL语句中的customer_row表为行存表,orders和lineitem为列存表,该场景在默认参数的情况下无法走向量化引擎,Row Adapter算子表示将列存数据转为行存数据,对应的查询计划为:

这种场景,可以选择开启enable_force_vector_engine参数,通过向量化执行引擎来执行,Vector Adapter算子表示将行存数据转换为列存数据,每个算子前面的Vector表示改算子为向量化引擎的执行器算子,对应的查询计划为:

从上述计划可以看出,向量化引擎相比行执行引擎,执行性能有数倍的提升效果。

2.5 query_dop参数

GaussDB(DWS)支持并行计算技术,当系统的CPU、内存、I/O和网络带宽等资源充足时,可以充分利用富余硬件资源,提升语句的执行速度。在GaussDB(DWS)中,通过query_dop参数,来控制语句的并行度,取值如下:

  • query_dop=1,串行执行

  • query_dop=[2…N],指定并行执行并行度

  • query_dop=0,自适应调优,根据系统资源和语句复杂度情况自适应选择并行度

query_dop参数设置的一些原则:

  • 对于短查询为主的TP类业务中,如果不能通过CN轻量化或下发语句进行业务的调优,则生成SMP计划的时间较长,建议设置query_dop=1。

  • 对于AP类复杂语句的场景,建议设置query_dop=0。

  • 计划并行执行之后必定会引起资源消耗的增加,当资源成为瓶颈的情况下,SMP无法提升性能,反而可能导致性能的劣化。出现资源瓶颈的情况下,建议关闭SMP,即设置query_dop=1。

设置query_dop=0可以实现自适应调优,在部分场景下语句执行的并行度没有达到最优,这种情况可以考虑通过query_dop参数设置并行度。

例如下面的SQL:

select count(*) from 
(
    select
    l_orderkey,
    count(*) as count_order
    from
    lineitem
    group by
    l_orderkey
);

在query_dop=0时使用的并行度为2。

设置query_dop=4时使用的并行度为4,执行时间相比并行度为2时有明显的提升。

3. 数据库全局GUC参数

在使用GaussDB(DWS)时,全局的GUC参数对集群整体性能影响很大,这里介绍一些常用参数以及推荐的配置。

3.1 数据内存参数

影响数据库性能的五大内存参数有:max_process_memory、shared_buffers、cstore_buffers、work_mem和maintenance_work_mem。

max_process_memory

max_process_memory是逻辑内存管理参数,主要功能是控制单个CN/DN上可用内存的最大峰值。

计算公式:max_process_memory=物理内存*0.665/(1+主DN个数)。

shared_buffers

设置DWS使用的共享内存大小。增加此参数的值会使DWS比系统默认设置需要更多的System V共享内存。

建议设置shared_buffers值为内存的40%以内。主要用于行存表scan。计算公式:shared_buffers=(单服务器内存/单服务器DN个数)0.40.25

cstore_buffers

设置列存和OBS、HDFS外表列存格式(orc、parquet、carbondata)所使用的共享缓冲区的大小。

计算公式可参考shared_buffers。

work_mem

设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。

ORDER BY,DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。

对于复杂的查询,可能会同时并发运行好几个排序或者散列操作,每个都可以使用此参数所声明的内存量,不足时会使用临时文件。同样,好几个正在运行的会话可能会同时进行排序操作。因此使用的总内存可能是work_mem的好几倍。

计算公式:

对于串行无并发的复杂查询场景,平均每个查询有5-10关联操作,建议work_mem=50%内存/10。

对于串行无并发的简单查询场景,平均每个查询有2-5个关联操作,建议work_mem=50%内存/5。

对于并发场景,建议work_mem=串行下的work_mem/物理并发数。

maintenance_work_mem

maintenance_work_mem用来设置维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。

当自动清理进程运行时,autovacuum_max_workers倍数的内存将会被分配,所以此时设置maintenance_work_mem的值应该不小于work_mem。

3.2 连接相关GUC参数

连接相关的参数有两个:max_connections和max_prepared_transactions

max_connections

允许和数据库连接的最大并发连接数。此参数会影响集群的并发能力。

设置建议:CN中此参数建议保持默认值。DN中此参数建议设置为CN的个数乘以CN中此参数的值。

增大这个参数可能导致GaussDB(DWS)要求更多的System V共享内存或者信号量,可能超过操作系统缺省配置的最大值。这种情况下,请酌情对数值加以调整。

max_prepared_transactions

设置可以同时处于"预备"状态的事务的最大数目。增加此参数的值会使GaussDB(DWS)比系统默认设置需要更多的System V共享内存。

NOTICE:

max_connections取值的设置受max_prepared_transactions的影响,在设

max_connections之前,应确保max_prepared_transactions的值大于或等

max_connections的值,这样可确保每个会话都有一个等待中的预备事务。

3.3 并发控制GUC参数

max_active_statements

设置全局的最大并发数量。此参数只应用到CN,且针对一个CN上的执行作业。

需根据系统资源(如CPU资源、IO资源和内存资源)情况,调整此数值大小,使得系统支持最大限度的并发作业,且防止并发执行作业过多,引起系统崩溃。

当取值-1或者0时,不限制全局并发数。

在点查询的场景下,参数建议设置为100。

在分析类查询的场景下,参数的值设置为CPU的核数除以DN个数,一般可以设置5~8个。

3.4 其他GUC参数

bulk_write_ring_size

数据并行导入使用的环形缓冲区大小。

该参数主要影响入库性能,建议导入压力大的场景增加DN上的该参数配置。

checkpoint_completion_target

指定检查点完成的目标。

含义是每个checkpoint需要在checkpoints间隔时间的50%内完成。

默认值为0.5,为提高性能可改成0.9。

data_replicate_buffer_size

发送端与接收端传递数据页时,队列占用内存的大小。此参数会影响主备之间复制的缓冲大小。

默认值为128MB,若服务器内存为256G,可适当增大到512MB。

wal_receiver_buffer_size

备机与从备接收Xlog存放到内存缓冲区的大小。

默认值为64MB,若服务器内存为256G,可适当增大到128MB

4. 总结

本篇文章主要介绍了GaussDB(DWS)性能调优涉及到的优化器和系统级GUC参数,通过合理配置这些GUC参数,能够充分利用好CPU、内存、磁盘IO和网络IO等资源,提升语句的执行性能和GaussDB(DWS)集群的整体性能。

5. 参考文档

  1. GaussDB(DWS) SQL进阶之SQL操作之聚集函数 GaussDB(DWS) SQL进阶之SQL操作之聚集函数-云社区-华为云

  2. PB级数仓GaussDB(DWS)性能黑科技之并行计算技术解密 PB级数仓GaussDB(DWS)性能黑科技之并行计算技术解密-云社区-华为云

  3. 常见性能参数调优设计 常见性能参数调优设计_数据仓库服务 GaussDB(DWS)_性能调优

文章转载自:华为云开发者联盟

原文链接:https://www.cnblogs.com/huaweiyun/p/18119306

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

移动医保支付

传统就医流程中&#xff0c;涉及“三长一短”的难题&#xff0c;因此根据国家政策及互联网的能力支持&#xff0c;用户在微信或者支付宝上激活医保电子凭证之后&#xff0c;无需在医院窗口排队&#xff0c;即可通过微信小程序或者公众号、支付宝小程序缴纳医保挂号或医保门诊费…

Java常用API_System——常用方法及代码演示

1.System.exit(int status) 方法的形参int status为状态码&#xff0c;如果是0&#xff0c;说明虚拟机正常停止&#xff0c;如果非0&#xff0c;说明虚拟机非正常停止。需要将程序结束时可以调用这个方法 代码演示&#xff1a; public class Test {public static void main(S…

如何远程监控员工的电脑

如何远程监控员工的电脑 为什么要对员工使用电脑的行为进行监控呢&#xff1f;对企业来说是有其必要性的。其必要性主要体现以下4个方面。 1.数据安全与知识产权保护 防止数据泄露&#xff1a;企业内部往往存储着大量的敏感信息&#xff0c;如客户数据、财务资料、商业秘密、…

使用Code开发Django_模版和CSS

转到定义 和 查看定义 在使用Django或任何其他库的过程中&#xff0c;我们可能需要检查这些库中的代码。VS Code提供了两个方便的命令&#xff0c;可以直接导航到任何代码中的类和其他对象的定义&#xff1a; 转到定义 在Python开发环境中&#xff0c;我们可以轻松地对函数、类…

【QT学习】Graphics View框架(高阶篇)- 使用Graphics View框架创建开机动画

【QT学习】Graphics View框架&#xff08;高阶篇&#xff09;- 使用Graphics View框架创建开机动画_qgraphicsview 一步-CSDN博客 前言 在上一篇《Graphics View框架&#xff08;进阶篇&#xff09;- 派生QGraphicsItem类创建自定义图元item》中&#xff0c;我们介绍了创建自定…

助力AIGC暴雨推出4卡液冷图站TR770

2022年&#xff0c;ChatGPT横空出世&#xff0c;正式拉开了生成式人工智能&#xff08;AIGC&#xff09;的序幕&#xff1b;2024年&#xff0c;Sora惊艳亮相&#xff0c;再度将AIGC技术推向高潮&#xff0c;引发了全球范围内的新一轮科技竞赛与创新热潮。从文字创作的灵感迸发&…

图像处理环境配置opencv-python

下载python&#xff0c;配置pip使用清华源下载镜像&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 切换到python目录下&#xff0c;右击cmd&#xff0c;执行pip升级指令: python -m pip install --upgrade pip 下载opencv&#x…

“鲜花换冥币,文明寄哀思“张家口慈善义工联合会清明节活动

又是一年春草绿&#xff0c;梨花风起正清明。扫墓祭祖、缅怀先人是清明节的重要民俗活动&#xff0c;为摒弃传统陋习&#xff0c;树文明祭祀新风&#xff0c;2024年4月4日&#xff0c;张家口慈善义工联合会携手市人民公墓西祥园组织志愿者们开展以“鲜花换冥币&#xff0c;文明…

windows下使用的的数字取证工作工具套装:forensictools

推荐一套windows下使用的的数字取证工作工具套装&#xff1a;forensictools 部分工具包括&#xff1a; ▫️exiftool&#xff0c;一个命令行应用程序和 Perl 库&#xff0c;用于读写元信息。 ▫️YARA&#xff0c;一款开源工具&#xff0c;用于对恶意软件样本进行识别和分类。…

开源区块链系统/技术 总结(欢迎补充,最新)

1. FISCO BCOS FISCO BCOS 2.0 技术文档 — FISCO BCOS 2.0 v2.9.0 文档https://fisco-bcos-documentation.readthedocs.io/ 2. ChainMaker&#xff08;长安链&#xff09; 文档导航 — chainmaker-docs v2.3.2 documentationhttps://docs.chainmaker.org.cn/v2.3.2/html/in…

移动机器人运动规划 | 基于图搜索的Dijkstra 和 A*算法详解

Dijkstra 算法 Dijkstra 算法与BFS算法的区别就是 : 从容器中弹出接下来要访问的节点的规则不同 BFS 弹出: 层级最浅的原则&#xff0c;队列里最下方的元素 Dijkstra 弹出: 代价最小的节点g(n) g(n) :表示的是从开始节点到当前n节点的代价累加 Dijkstra在扩展的时候&#x…

深度挖掘商品信息,jd.item_get API助您呈现商品全面规格参数

深度挖掘商品信息&#xff0c;特别是在电商平台上&#xff0c;对于商家、开发者和用户来说都至关重要。jd.item_get API作为京东开放平台提供的一个强大工具&#xff0c;能够帮助用户轻松获取商品的全面规格参数&#xff0c;进而为商品分析、推荐、比较等提供有力的数据支撑。 …

arm64 - 系统调用

起因 群里做网络的小伙伴问了一个问题&#xff0c;他在wifi驱动的某个函数里加了dump stack&#xff0c;然后插入驱动&#xff0c;发现调用栈是这样的&#xff0c;为什么呢&#xff1f; 代码追溯 insmod这个app&#xff0c;是在busybox中的&#xff0c;所以找到busybox的代…

大话设计模式——13.外观模式(Facade Pattern)

简介 又称门面模式&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。 UML图 应用场景&#xff1a; 第三方SDK大多使用该模式&#xff0c;通过一个外观类&#xff0c;可对用户屏蔽…

蓝桥杯DFS-最大数字

解题思路 我们从最高位开始要利用自己的1号操作和2号操作保证当前这个数位的数一定要尽可能最大。 然后分别考虑两种操作&#xff0c;首先两种操作不可能混用&#xff0c;因为它们是抵消的效果&#xff0c;所以要么对这个数全使用1操作&#xff0c;要么2操作。假设某个数位的…

easyexcel处理复杂表头

需求&#xff0c;模板如下 功能如下 开始整活&#xff0c;依赖包。 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency>下载导入模板 1.方法 GetMapping…

详解FB广告三种受众类型,提升广告投放精准度

在Facebook广告中&#xff0c;精确地定位潜在客户至关重要。然而&#xff0c;达到完美精准度通常是一个逐渐逼近的过程&#xff0c;涉及到多次迭代和细化目标人群。Facebook提供了三种主要的受众类型&#xff1a;核心受众(Core Audiences)、自定义受众(Custom Audiences)和类似…

携手博鳌亚洲论坛,五粮液“以和美,敬世界”

执笔 | 尼 奥 编辑 | 扬 灵 3月26-29日&#xff0c;以“亚洲与世界&#xff1a;共同的挑战 共同的责任”为主题的博鳌亚洲论坛2024年年会在海南博鳌盛大召开&#xff0c;聚集全球政商学媒等各国代表汇聚一堂&#xff0c;围绕投资亚洲未来、减少贸易碎片化、加速迈向零碳电…

朗汀留学美国生物医学工程专业留学部分录取案例合集

满怀期待的憧憬与金榜题名的喜悦交织着未来的掌声&#xff0c;捧在手心里的不仅仅是一份一份努力浇灌的录取通知&#xff0c;更是一起拼搏走过的岁月沉淀。 我们感恩每一位朗汀留学的学生和家长&#xff0c;是你们的支持与信任&#xff0c;让我们有机会共享此刻的荣耀&#xff…

初涉 VS Code 插件开发

官方文档&#xff1a;Extension API | Visual Studio Code Extension API 实战记录 从hello word&#xff01;开撕 根据文档开始创建插件 Your First Extension | Visual Studio Code Extension API 全局安装Yeoman工具 npm install --global yo generator-code 使用Yeom…