更新时间:2024-06-07 GMT+08:00

SQL自诊断

技术背景

业务中包含大量查询,这些查询在执行计划、执行层面有什么样的问题,比如估算是否不准确、是否存在数据倾斜、是否存在统计信息未收集并且如何收集统计信息等。SQL自诊断为用户提供了一种更为高效易用的性能问题定位方法。主要帮助用户对批处理作业的SQL调优过程进行简化,希望输入SQL之后能够方便的批量得到SQL所存在的问题和针对问题给出的调优建议,而不是让用户依次去把作业集中的SQL单独提取出来改写,重现有性能问题的SQL语句并且通过查看Explain Performance依次排查问题,改写SQL,调整参数等复杂的调优。

功能描述

在执行作业之前,配置有关GUC参数参见《开发指南》中“resource_track_level”和“resource_track_cost”参数。运行用户作业之后,通过查看相关系统视图获得相关查询作业可能存在的性能问题。这些系统视图中会给出导致性能问题的可能原因,根据这些“性能告警”,参考《开发指南》中“SQL自诊断”章节,就可以对存在性能问题的作业进行调优。

技术原理

图1 SQL自诊断技术原理
  1. CN端对SQL进行查询编译生成计划树,通过诊断分析器对执行计划树诊断出查询模式下可识别的问题(包括统计信息未收集和SQL不下推的告警)。
  2. DN端执行SQL语句,在运行时将有关统计信息写入DN共享内存。如果当前SQL运行是算子模式(可以诊断所有支持的告警场景),则在SQL运行过程中收集算子执行统计信息。
  3. DN端完成SQL的执行,向CN返回运行结果。如果是算子模式,则DN向CN端返回收集的运行时状态,并由诊断分析器对其内容进行分析,将有关分析结果进行记录。
  4. 内存中统计信息3分钟会被清理一次。如果需要记录所有历史信息,打开GUC参数enable_resource_record,内存中统计信息每3分钟会被持久化到特定系统表中。

效果收益

场景描述

收益

多列/单列统计信息未收集

通过analyze收集统计信息,生成更好的执行计划。

SQL不下推

上报导致不下推的原因。通过SQL调优尽量将SQL下推。

HashJoin中大表做内表

数据量较大并且产生了下盘,对性能影响较大。通过SQL调优避免这种情况。

大表等值连接使用Nestloop

Nestloop在数据量较大时对性能影响较大。通过SQL调优避免这种情况。

大表Broadcast

在网络上发送大量数据,对性能影响较大。通过SQL调优避免这种情况。

数据倾斜

造成某些节点成为系统瓶颈。

索引不合理

索引不合理,导致扫描行数过多。修改索引。

估算不准

估算与实际执行行数偏差较大,导致选取计划不是最优。