AnalyticDB MySQL版的SQL诊断功能可以对SQL查询进行Query、Stage和算子(Operator)级别的信息统计,再在统计信息的基础上进行诊断并提供调优建议。本文介绍如何查看和分析Stage级别诊断结果。
诊断结果类型
说明 查看Stage级别诊断结果的方法,请参见查看诊断结果。
较大的数据量被广播
- 问题
广播(Broadcast)是在两个相邻的Stage间,上游向下游Stage传输数据时所用的一种方法(更多详情,请参见数据输出类型)。如果某个Stage广播了较多数据,可能会导致查询占用较大的峰值内存。
- 建议
-
首先需要判断当前的广播操作是否合理。某个Stage中的数据被广播,一般是因为这些广播后的数据会作为Join操作的右表(Builder端)来在内存中构建哈希表,所以右表越小越好。在高并发查询的场景下,这样有利于减少节点间的网络连接,提升系统整体稳定性。对于Join条件存在数据倾斜的场景,如果不广播小表,那么会出现如下图的执行流程:
假设上图中的表
Tsmall
在b
字段上存在严重数据倾斜,那么当表Tbig
以a
字段均匀地分布在AnalyticDB MySQL版的存储节点上时,对Tbig
表的重分布会存在处理时间长尾,而且在下游Stage执行Join时也会存在长尾。如果Tbig
表不做重分布,而只广播Tsmall
表,会有如下的执行流程:如上图所示,只广播
Tsmall
这张小表,可以缓解数据倾斜带来的处理长尾问题。 - 在某些场景下,例如统计信息过期,会导致预估的表大小有偏差,从而导致广播了大量数据,此时可以考虑使用Hint
JOIN_DISTRIBUTION_TYPE=repartitioned
来关闭数据的广播功能。
-
Stage输入数据倾斜
- 问题导致Stage输入数据倾斜的可能原因如下:
- 建表时选择的分布字段不合理,导致Stage中的某个数据扫描算子在扫描数据时存在倾斜。
- 上游Stage的数据通过网络传输到当前Stage时存在倾斜。
- 建议
- 建表时选择合适的分布字段。更多详情,请参见分布字段合理性诊断。
- 查看上游Stage是否存在Stage输出数据倾斜问题。更多详情,请参见Stage输出数据倾斜。
Stage输出数据倾斜
- 问题
Stage输出数据倾斜会导致当前Stage处理耗时不均匀,存在长尾;如果下游Stage处理过程复杂,也会导致下游Stage在处理数据时存在长尾,最终都会影响查询整体性能。
- 建议
通过诊断结果中提示的字段名来判断是否是这些字段存在数据倾斜(如出现大量空值)。