AnalyticDB MySQL版的SQL诊断功能可以对SQL查询进行Query、Stage和算子(Operator)级别的信息统计,再在统计信息的基础上进行诊断并提供调优建议。本文介绍如何查看和分析Stage级别诊断结果。

诊断结果类型

说明 查看Stage级别诊断结果的方法,请参见查看诊断结果

较大的数据量被广播

  • 问题

    广播(Broadcast)是在两个相邻的Stage间,上游向下游Stage传输数据时所用的一种方法(更多详情,请参见数据输出类型)。如果某个Stage广播了较多数据,可能会导致查询占用较大的峰值内存。

  • 建议
    • 首先需要判断当前的广播操作是否合理。某个Stage中的数据被广播,一般是因为这些广播后的数据会作为Join操作的右表(Builder端)来在内存中构建哈希表,所以右表越小越好。在高并发查询的场景下,这样有利于减少节点间的网络连接,提升系统整体稳定性。对于Join条件存在数据倾斜的场景,如果不广播小表,那么会出现如下图的执行流程:1

      假设上图中的表Tsmallb字段上存在严重数据倾斜,那么当表Tbiga字段均匀地分布在AnalyticDB MySQL版的存储节点上时,对Tbig表的重分布会存在处理时间长尾,而且在下游Stage执行Join时也会存在长尾。

      如果Tbig表不做重分布,而只广播Tsmall表,会有如下的执行流程:2

      如上图所示,只广播Tsmall这张小表,可以缓解数据倾斜带来的处理长尾问题。

    • 在某些场景下,例如统计信息过期,会导致预估的表大小有偏差,从而导致广播了大量数据,此时可以考虑使用HintJOIN_DISTRIBUTION_TYPE=repartitioned来关闭数据的广播功能。

Stage输入数据倾斜

  • 问题
    导致Stage输入数据倾斜的可能原因如下:
    • 建表时选择的分布字段不合理,导致Stage中的某个数据扫描算子在扫描数据时存在倾斜。
    • 上游Stage的数据通过网络传输到当前Stage时存在倾斜。
  • 建议

Stage输出数据倾斜

  • 问题

    Stage输出数据倾斜会导致当前Stage处理耗时不均匀,存在长尾;如果下游Stage处理过程复杂,也会导致下游Stage在处理数据时存在长尾,最终都会影响查询整体性能。

  • 建议

    通过诊断结果中提示的字段名来判断是否是这些字段存在数据倾斜(如出现大量空值)。