SQL优化作为提升数据库性能的关键手段,一直都是DBA的一项重要技能。当前,企业数据量不断增长、业务日益复杂,对数据库性能的要求越来越高,掌握更好的SQL优化能力更好地助力DBA完成业务需求、提高自身职业价值。
然而,掌握SQL优化技术并非易事,需要不断地学习和积累经验。第三期【专家有话说】系列专栏则将邀请到了4位业内公认的 SQL优化大师:梁敬彬、罗敏、刘永甫和杨廷琨,为大家分享他们在实际工作中积累的宝贵经验,包括但不限于SQL优化策略、实际优化方法、国产数据库环境下是否适用、学习路径和思考方向等,望帮你打通任督二脉、继续坚持下去!
🎙️梁敬彬
熟悉我的朋友知道我擅长SQL优化,2017年出版过近80万字的技术书籍——《收获,不止SQL优化》,十余次印刷,反响热烈,在此,感谢支持我的读者。今天,我将站在SQL优化思想的角度,分享一个带有批判性思维的观点:“不优化或许是最好的优化!”,并通过一次平台SQL优化案例进行剖析。
在我为某平台做完优化后系统运行得非常顺畅,有趣的是,我既没有进行任何的SQL改写,也没有建索引,更没有调整表结构或参数,可以说,我几乎什么都没做。那么,是如何让SQL变得更快呢?其实,关键就在于批判性思维,通过分析SQL的必要性、全局性和合理性,从源头上带来意想不到的突破。
- SQL存在的必要性
在该平台的A模块中,有一类无法优化的SQL。深入分析后,我发现这些SQL的业务逻辑已经过时。就像一个被误导的员工,努力做着已被市场淘汰的工作。最终,我们直接将这些SQL下线,问题迎刃而解。
启示:在优化之前,首先要质疑SQL是否还有存在的必要。都没有SQL了,岂不最为高效?
- SQL运行的全局性
B模块的一批SQL看似效率低下,但问题并不在SQL本身。进一步调查发现,主机资源极度紧张。通过优化资源分配,这些SQL的性能立即得到显著提升。这就像改善了一个员工的工作环境,让其潜力得以充分发挥。
启示:SQL优化不能局限于代码层面,还要考虑整个运行环境。有时,问题根本不在SQL本身!
- SQL需求的合理性
C模块中有一批每天执行千万次的SQL,严重影响系统性能。经过与业务部门沟通,我们将其执行频率从每分钟一次调整为每天一次。这相当于大幅减轻员工超负荷的工作任务,使其能够更高效地工作。
启示:过度频繁的操作可能源于不合理的需求。调整业务,其效果往往比单纯优化SQL好得多!
总而言之,“不优化就是最好的优化” 强调以批判性的思维从源头找问题,表面上看似什么都没做,实际上SQL优化的效果早已拉满。希望这些案例能为大家提供新的视角和启迪,让我们在实际工作中更高效地发现和解决问题。
🎙️罗敏
近日与某国产数据库厂商研发老总聊天,他感言道:“我们从事数据库专业的人对数据库核心技术应该有颗敬畏之心。”我理解老总说的数据库核心技术不仅是指后台进程、内存结构、参数设置、架构设计等技术,而主要是指关系数据库领域最基础的SQL语言,因为优化器等内部引擎都是为SQL语言服务的。
在今年的全国数据库大会(DTCC)上,当我聆听了一位国产数据库厂商研发人员介绍其优化器功能如何深邃、算法如何精巧之后,我提问道:“数据库性能问题是个整体,不完全取决于优化器能力,而是与SQL开发质量有直接关系。如果开发人员连索引都没设计好,优化器也是无能为力的。请问贵公司数据库有自动诊断SQL语句缺索引的能力吗?”回答是暂不具备。我知道Oracle在10g年代就具有了自动化、智能化诊断SQL语句质量问题的能力,例如缺索引、缺统计数据等情况的分析。但我也知道,Oracle在这个方面能力依然有限,这也是广大数据库研发和实施人员共同面对的问题和挑战。
我以为SQL开发和数据库核心引擎是一个整体,二者应该高度融合,甚至起到化学作用,方能达到理想的高质量和高性能。
- 一方面,开发人员应该深入了解每个数据库优化器的特性和最新发展,并加以合理运用。例如,很多客户很忌惮Global分区索引,就是因为在分区维护操作之后,Global分区索引将失效,影响业务可访问性。殊不知,Oracle在12c版本推出的异步Global索引维护功能已经很好地解决了这个问题,作为开发人员应该敏锐地发现这个新特性,从而通过Global分区索引既有效提升性能,同时又确保业务连续性。
- 另一方面,做数据库核心技术不仅要做好引擎本身功能,而且一定要主动拥抱应用,甚至为应用提供自动化、智能化的开发建议,例如主动发现索引设计、分区设计等问题。在这个领域,既有传统的SQL开发规则、审核工具可发挥重要作用,也有基于机器学习、人工智能、大模型等最新技术的运用,能更精准地发现SQL开发质量问题,提高开发人员和DBA的问题诊断能力。
最后,我一直不赞同弱化数据库功能,过于突出应用开发的做法。SQL语言不仅功能已经非常强大,而且具有产品化的稳定性,只要合理运用还会大幅度提高性能。如果本该由SQL语言完成的各种统计运算、树和图的遍历算法等,一定要在应用程序中去实现,那么由此导致的性能问题就不是SQL优化问题,而是纯应用优化问题。
🎙️刘永甫(老虎刘)
这次的主题主要是我最擅长的SQL优化,我就结合我在Oracle数据库的优化经验,以及开源数据库和国产数据库的一些简单比较,给想提高SQL优化技术的DBA一些建议:
SQL优化应该是DBA的一项基本技能,但是很多DBA都比较欠缺这项技能,造成市场竞争力差, 系统上云后更是被"降本增效"的首选。开发人员的大部分精力都用在了业务逻辑实现上,没有那么多时间研究各种数据库的”使用说明书“,在SQL优化上需要DBA的帮助,如果DBA能够提供优化建议,不但自身地位有提升,开发与运维的关系也会相对比较和谐。
那么,SQL优化应该怎么学?我的观点:索引技术是基础,写法是核心,看懂执行计划是关键;了解一些基本原理和套路(规则),配合一些实战案例,达到中等水平也不是难事。
首先,建议大家多学习Oracle数据库的优化方法,如果有Oracle数据库的SQL优化基础,到了其他数据库也很容易上手。因为SQL优化思路大部分都是通用的,我的很多学员在国产数据库也是优化骨干;Oracle的学习材料多,而且大部分国产数据库都兼Oracle。
再简单谈谈数据库之间的差异,比如Oracle/PostgreSQL数据库的表默认是堆表(heap table),MySQL/达梦等数据库的表默认是索引组织表(IOT),如果SQL是按主键查询,那么索引组织表的性能比堆表要好,因为堆表的主键和表是分开存储的,相当于IOT表的二级索引,多了一步回表的操作。但这只是一方面, 如果使用IOT表,Oracle的很多高级特性是不支持的;还有Oracle的索引不保存null值这个特性,其他大部分数据库的索引是保存null值的(编辑注:关于这一要点老虎刘通过一则优化案例进行了具体展示、点评,详见评论区)。
最后,列举一些SQL优化需要掌握的知识点,看看你了解多少,这些技术不管是Oracle还是其他数据库,都是相通的:
- 谓词字段使用函数或参与运算;
- 模糊查询;
- 标量子查询;
- 隐式类型转换;
- not in与not exists的区别;
- inner join与left join的区别;
- 分页写法;
- 去重写法;
- 分区技术;
- hint技术;
- 统计信息收集;
- 数据库支持哪些查询转换(不支持的需要改写);
- 分析函数;
…
SQL优化入门很容易,简单记一些套路即可。但是如果要想深入学习,就需要花更多的时间和精力系统地学习,多了解一些原理,才能应对更加复杂的SQL。
🎙️杨廷琨
SQL优化是数据库运维工作中非常重要的一环,对产品环境的持续优化,可以有效的提升数据库的性能和稳定性,保证数据库服务器具有更长时间的生命周期。同时SQL优化也是数据库开发的重要技能,SQL优化能力掌握的不好,是无法开发出高效稳定的SQL代码的。因此SQL优化是数据库开发和数据库运维的交集,其重要性不言而喻。
而对于现在的国产数据库而言,SQL优化会变得更加重要。因为国产数据库大多起步时间较短,在优化器方面的积累相对有限,因此和传统的商业数据库相比,同样的硬件条件下,国产数据库能支持并发和业务量都会更低,这就对迁移后的数据库环境提出了更高的要求和挑战,显然SQL优化能力也是国产数据库环境急需的。
所幸的是,SQL优化能力是很容易从传统的数据库平滑转移到国产数据库上的,一方面现在国产数据库的SQL兼容性越做越好,SQL在不同数据库之间相似度非常高,而另一方面由于SQL的底层范式基础是不变的,所以SQL优化的基础是相同的,因此其实SQL优化远比运维更方便切换到国产数据库中去。
最后,SQL能力的培养其实和学习其他数据库技术还是有一定差异的,对于数据库其他技术,我会建议去阅读官方文档,但是唯独SQL能力,需要靠自己多写多练才能提升,无论是看书还是看文档,对于SQL能力的提升都赶不上自己去写SQL解决实际问题。
本期【专家有话说】专栏中,四位专家从各自独特的视角和经验出发,分享了提升SQL优化技能的思维方式与实际技巧。梁敬彬为大家展示了SQL优化过程中不能埋头猛干,亦需具备批判性思维,从必要性、全局性和合理性角度挖掘潜在问题。罗敏则强调SQL是数据库核心技术,DBA需要对此怀有敬畏之心,并需树立全面的优化观念。刘永甫结合实际经验,为DBA梳理了学习方向和关键知识点,给出了切实可行的学习建议。而针对当前数据库国产化现状,杨廷琨首先肯定了SQL优化技术的重要性,并点明了提升SQL能力需多写多练的实践要点。
对于DBA而言,SQL优化是一项需要持续学习和实践的技能。除了学习理论知识、新的技术方法,更需要通过不断地处理各种实际问题、积累经验,善于思考、敢于实践、勤于总结。相信长此以往,你也能修炼成SQL优化大师!
本文已收录至【论道数据库 解读新发展】墨天轮专家邀稿合辑,点击可阅读前两期专家专栏文章及其他邀稿。
评论





