SQL优化技术

SQL优化技术能够自动检测并分析数据库中的慢查询问题,识别出执行效率低下的SQL语句。通过深入分析这些SQL的执行计划,技术会提出改进建议或直接进行优化,比如重写SQL语句、调整索引使用等,以减少查询时间,降低资源消耗。

背景信息

作为数据库管理员或应用开发者,都有SQL优化需求,但是数据库上执行的SQL千差万别,且伴随着业务快速迭代、数据分布特征变化、热点变化、数据库版本升级等持续动态变化,这些都使得SQL优化需要投入大量的人力物力。

挑战

  • 精准性:如何构建异常检测机制,实现优化时机的精准识别,问题SQL的精准定位。

  • 专业性:需要强大的专业性优化诊断后盾,没有有效的专业诊断,优化就无从谈起。

  • 安全性:线上无小事,线上变更如何做到安全可控。

  • 全面性:优化效果的全面多维度跟踪,全面实时评估,也是保证安全性的要求。

  • 联动性:对于复杂的线上问题,有时需要综合治理,如突发的恶性慢SQL问题,DAS的自动SQL限流,自动SQL优化需要形成联动效应,实现问题的标本兼治。

  • 规模性:如何构建具备足够扩展性的服务架构,以支撑几十万级、百万级的大规模自动优化。

问题风险

考虑两个重要的时间点,如下图所示,一个简单的慢SQL趋势,T1代表我们发现数据库实例性能异常的时间点,从此刻开始着手慢SQL的优化,T2是优化过程完毕时间点,实例恢复常态。在传统的优化处理中,这一过程一般完全依赖人力驱动,常常会暴露出两个方面的严重不足:

  • T1过于偏后,即异常发现不及时、响应不及时,即使发现时,问题可能已堆积多时,已处在故障的边缘。

  • 从T1发现到T2处理的时间过长,一方面严重影响用户体验,另一方面大大增加故障风险。

sql

除了上述的两个问题, 我们还面临着另外两个更为严峻的挑战:

  • 如何实现持续优化?及时发现问题并优化,避免问题积累,保证稳定的同时保持数据库实例持续处在最佳运行状态。

  • 如何缩短处理时长,最大限度减少影响,采用综合治理手段保证数据库实例稳定性,实现标本兼治?

传统方式依赖人力驱动,这两方面的局限性会显得尤为突出,常常处于故障驱动、疲于应对、四处救火的状态。随着业务规模发展,实例规模扩大,所有这些问题也随之被放大,并且大概率会进入即使投入更多人力也没有办法解决的恶性循环状态。

解决方案

自动SQL优化服务是阿里云数据库自治服务DAS中最为核心服务之一,以自优化的自治能力实现SQL优化的闭环。其闭环能力如下:SQL优化

  • 负载(Workload)异常检测,识别数据库业务变化,快速识别与定位问题SQL,如新增慢SQL、性能恶化SQL、不高效SQL等。

  • 针对问题SQL,自动调用SQL诊断优化服务生成优化建议,如最优索引的创建、SQL语句改写、引擎推荐等。

  • 自动完成优化建议风险评估,根据数据库实例负载情况、实例画像自动生成灰度计划,自动编排优化任务。

  • 自动选取运维窗口,依据灰度计划,完成相关线上变更,目前阶段主要支持索引的自动上线变更。

  • 针对上线的变更,启动多维度的优化效果跟踪,持续实时全面的性能回归风险评估,符合预期,自动计算优化收益,不符预期,自动回滚。

依托该全自动优化闭环,将重人工的被动式优化转变为以智能化为基础的主动式持续优化,最终实现SQL优化的无人值守。试想下,它就如同一群数据库专家7x24小时不间断地守护在你的数据库旁边,不知疲倦,时刻保持数据库系统运行在最佳优化状态。

实现架构

啊

DAS自动SQL优化是一个基于数据驱动的闭环流程,上图简单描述了整个流程:

  • 异常事件:异常事件是触发自动SQL优化的引信,异常事件由DAS事件中心统一管理,异常事件产生自实时异常检测、离线分析、workload检测、告警系统等等。

  • 诊断发起:自动SQL优化服务从事件中心收到异常事件后,会对实例进行初步判断,向诊断引擎发起诊断请求并处理诊断结果(一条或多条建议),完成有效性评估,生成新的优化事件发送至事件中心,驱动下一步优化流程。

  • 建议推送:用户进入DAS“自治中心”,在未开启全自治模式下,用户可以选择是否接受优化建议,在自主决策下触发后续自动化优化流程。

  • 变更上线:选择运维窗口期,下发变更命令,并确认执行情况。

  • 效果跟踪和衡量:当优化建议生效后,决策引擎会启动跟踪任务,对被优化的SQL及相关SQL进行性能跟踪,如果性能出现衰退,则自动回滚。通常跟踪24小时后,如无回滚则计算收益。

问题发现

SQL优化支持多种场景的SQL异常发现,概括为以下三种:

  • 定时触发:常规性在运维窗口期,定期对用户实例发生的慢SQL进行离线分析,发起SQL优化。

  • 部分SQL性能恶化触发:Workload异常检测算法会实时发现性能恶性SQL,触发SQL自动优化。对于复杂的线上问题,自动SQL优化和DAS的自动SQL限流会形成联动效应,发起SQL自动优化。

  • 实例workload变化触发:随着业务SQL的上线和下线,数据库负载、数据量发生变化,现有索引不能很好匹配当前业务的性能要求,发起实例Workload层面的诊断优化。

诊断能力

DAS的SQL诊断优化服务是自动SQL优化强大后盾,它采用基于代价模型方式,也就是采用和数据库优化器相同的方式去思考优化问题,并会以执行代价的方式量化评估所有可能的推荐候选项,最终作出可靠推荐。

该服务已在阿里巴巴集团内部稳定运行多年,日平均诊断量在5万左右,支撑着整个集团业务应用的SQL优化,SQL诊断成功率保持在98%以上,针对慢SQL的推荐率保持在75%以上。

安全变更

安全变更体现在变更前的安全检查、灰度的变更策略、变更后的性能跟踪。

  • 安全检查:为降低风险,变更仅发生在运维窗口期,同时我们会进行主备延迟、实例负载和表空间判断,各指标都在安全范围内时才进行变更。

  • 灰度的变更策略:如大量分库分表场景,为降低风险,自动生成灰度计划,分批变更。变更过程中,系统会监控实例的主备延迟,一旦延迟超过阈值,立刻暂停该库的全部索引变更任务,并保障每个库仅允许一个变更任务执行。

  • 效果评估:效果评估算法会对被优化的SQL及相关SQL模板进行性能跟踪,避免出现性能恶化导致故障。性能跟踪的算法基于决策树模型,包括全量SQL追踪和慢SQL追踪等多维度追踪,对SQL模板优化后的性能指标与优化前进行对比,综合判断SQL模板在该时刻是否发生了性能衰减。业务往往是以天为周期变化,默认跟踪时间为24小时,若没有回滚,则认为本次优化成功,并计算实际优化收益。

支持的引擎

自动SQL优化目前已支持的数据库引擎包括RDS MySQLPolarDB MySQL版RDS PostgreSQL