美文网首页MysqlPL/SQL
移动下SQL中的表位置,性能提高18倍

移动下SQL中的表位置,性能提高18倍

作者: 码农小光 | 来源:发表于2020-06-01 00:01 被阅读0次

来自公众号:有关SQL
作者Lenis

下午,所有的SQL慢如牛。

平日里2-3秒搞定的SQL,这会非得弄个7-8秒。timeout更是频频爆出。搞得办公室怨叫声此起彼伏,真有点《生命协奏曲》的味道。

我是最听不得这些哀怨的,不仅仅是喊的难听,那些消极的声音,仿佛来自地狱的催命;更多是觉得,那是对我们这些DB Guy及其不友好的宣战啊。

DBA是公司最宝贵的资源,我们肯定调度过不来。索性自己上吧。还记得之前我说过的调优排错“三板斧”吗,今天又派上用场了。

第一板斧,找到谁在数据库上乱来。

幸好只是开发库,只有数量不多的连接,一查就知道,某个SQL发出了SOS的等待,占用大量的CPU,而且还在拼命的发出多线程请求。截获了它的SQL文本,拿出来一看,差点吓尿。

image

如此混乱的编码,换在平时,我可能都没兴趣看。poorman's formatter 这么好用的插件,估计这朋友对此一无所知。

好嘛,我帮你格式化下:

image

这回清晰多了。但各种缺陷也暴露无遗。很明显,会很慢。

丢到 SSMS 里面,足足等了69秒才出来数据。当时我的汗啊,这么慢的SQL在我的机器上发出,要被抓出来,不被大家给笑死。L 倒还是那个 L, 不过是 Laugh 罢了。(老读者一定知道 L 这个梗)

第二板斧,查看执行计划

image

排除那些复杂的 Index Spool,Stream Aggregation,这里面最吸引我的是同一张表,居然要扫描两次,就是那张 XXX_PER表。所以我不得不重新看下这段SQL的逻辑,简直是鬼才!

这种写法,大约就是“只有我看得懂的SQL,你们离不开我”的想法作祟下,搞出来的鬼。据我经验分析,往往都是刚出道的小聪明。

但凡看到我之前写过的文章 如何写好 5000 行的 SQL 代码,是绝对不可能写出这样的SQL。要么没懂重构的意义,要么就是甩小聪明。

所以,我做了些小调整:

image

把所有用到的列,都加到一个索引里面。再检查下执行计划

image

干净了,变快了。4秒,87426 条数据。18 倍的性能提升。当然,还有提升空间。

短暂的小插曲,每天都有。及时复盘,提高自己水平。

总结下,今天用到的技能:

1 - "三板斧"找端倪

2 - 三星索引好帮手

3 - 执行算子要常翻

相关文章

  • 移动下SQL中的表位置,性能提高18倍

    来自公众号:有关SQL作者Lenis 下午,所有的SQL慢如牛。 平日里2-3秒搞定的SQL,这会非得弄个7-8秒...

  • MySQL性能优化(六)-- in和exists

    in和exists哪个性能更优 sql脚本: 上面的sql中 订单表中(orders) 存在user_id,而又有...

  • 干货:MySQL性能优化,in和exists

    in和exists哪个性能更优 sql脚本: 上面的sql中 订单表中(orders) 存在user_id,而又有...

  • Excel如何移动数据透视表

    当在工作表中建立好数据透视表以后,如果发现位置需要调整,即将透视表移动到工作表的其他位置,或者是移动到新的工作表,...

  • 哪些SQL语句会引起全表扫描

    大家都知道,用SQL语句对数据库进行操作时,如果引起全表扫描会对数据库的性能形成影响,下面简单介绍下SQL中哪些情...

  • 性能优化技巧:预关联

    一、 问题背景与适用场景 SQL中JOIN的性能是个老大难问题,特别是关联表较多时,计算性能会急剧下降。 SQL实...

  • 初识分库分表

    1. 为什么要分库分表? 什么场景下需要分库分表? 单表数据上亿,查询性能下降; 解决大数据存储,提高访问性能; ...

  • SqlServer2008查询性能优化

    SQL性能杀手 在已经优化了硬件、操作系统和SQL配置的情况下,SQL中的性能杀手: ·低质量的索引 ·不精确的统...

  • 关系型数据库

    术语 SQL 约束 触发器 事件 游标 储存过程 SQL表设计 可读(参考阿里巴巴建表规范) 建议 扩展 性能 日...

  • SQL 高级 03

    SQL 高级 01 SQL 高级 02 CREATE INDEX 语句用于在表中创建索引。 在不读取整个表的情况下...

网友评论

    本文标题:移动下SQL中的表位置,性能提高18倍

    本文链接:https://www.haomeiwen.com/subject/mcjvahtx.html