暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

『 TechTalk 』GaussDB(DWS)什么是算子下盘

GaussDB DWS 2023-08-04
522


鲲鹏

华为云数仓技术专家


读完需要

8
分钟

速读仅需 3 分钟











处理性能问题时我们经常听到“下盘”这个概念,本文简单介绍什么是算子下盘、哪些算子会发生下盘、有哪些参数可以控制下盘、如何判断是否发生下盘、如何避免下盘。





任何计算都需要耗费内存空间,差别在于多少而已。如果耗费内存过多,会导致其他作业运行内存空间不足,导致作业不稳定,因此我们需要对查询语句的作业内存使用进行限制,保证作业运行的稳定性,以常见的排序操作为例:

  1. 500KB的数据进行排序,把全量数据load到内存,然后排序。嗯,这个可以轻松搞定

  2. 500MB的数据进行排序,把全量数据load到内存,然后排序。嗯,这个努把力也可以

  3. 500GB的数据进行排序,把全量数据load到内存,然后排序。嗯,机器会说你是个疯子,物理内存才256GB,我不陪你玩了,我要OOM

那对于500GB的数据,数据库怎么排序呢?这就需要使用外排了,除了算法之外,另外一个核心逻辑是,把需要使用的数据加载到内存中,不需要使用的数据写到磁盘上,内存中只保留有限的数据,这就是中间数据落盘的由来。当发生中间数据落盘时,我们称之为算子下盘。

当前GaussDB(DWS)可下盘算子有六类(向量化及非向量化共10种):

Hash(VecHashJoin),Agg(VecAgg),Sort(VecSort),Material(VecMaterial), SetOp(VecSetOp),WindowAgg(VecWindowAgg)。

  1. work_mem:

    可以判断执行作业可下盘算子是否已使用内存量触发下盘点,当内存使用超过该参数后将触发算子下盘

  2. temp_file_limit:

    可以限制落盘算子的落盘文件大小,一般建议根据实际情况设置,防止下盘文件将磁盘空间占满,超过该值将报错退出

  1. 通过下盘文件确认:

    下盘文件位于实例目录的base/pgsql_tmp目录下,下盘文件以pgsql_tmp$queryid_$pid命名,可以根据queryid确认是哪条sql发生了下盘。

  2. 根据等待视图(pgxc_thread_wait_status)确认:

    等待视图中,当出现write file时,表示发生了中间结果下盘

  3. 根据执行计划确认(explain performance):

    performance中出现spill、written disk、temp file num等关键字时,说明对应的算子出现了下盘

  4. 根据topsql确认(前提:topsql功能已开启):

    实时topsql或历史topsql中,spill_info字段中会包含下盘信息,如果该字段不为空,说明有DN实例出现了下盘

发生算子下盘时,算子运算数据将写入临时文件,带来5-10倍的性能下降,查询响应时间出现极大劣化,因此应尽可能避免下盘,可以考虑如下方法优化:

  1. 减小中间结果集:发生下盘时往往是由于中间结果集过大,因此可以增加过滤条件减少中间结果集大小

  2. 避免数据倾斜:数据倾斜严重时会导致单DN上数据量过大,引起单DN下盘

  3. 及时analyze:当统计信息不准时,行数估算可能偏小,导致计划选择非最优,从而出现下盘

  4. 单点调优:对业务sql进行单点调优

  5. 适当调大work_mem参数:当中间结果集无法减少时,应根据实际情况适当调大work_mem

GaussDB(DWS)开发者学习路径全景地图来喽!

在这里,您可以找到产品主页、产品试用、客户端下载地址、技术文章和视频学习地址等,只有您想不到,没有您找不到的。点击文末阅读原文,跟着地图打怪升级!























往期精彩回顾


恭喜!大数据“星河”标杆案例奖+



戳阅读原文,获取开发者学习路径全景地图

文章转载自GaussDB DWS,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论