专栏首页有关SQL如何提高阅读 SQL 源代码的快感

如何提高阅读 SQL 源代码的快感

今天的小 C 很不在状态。昔日的她,一大早肯定不会愁容满面,似乎像是星巴巴没有喝够的样子,兴奋不起来!11:30 了,很少听到她 HHKB 落键的清脆声,一定是遇到难题了!

“怎么,今天的热焦玛少了点劲儿嘛,感觉?”我走近了小 C。

“L, 谁面对着满屏的 SQL 都会提不起精神啊。何况这近 1500 行的代码,怎么看得过来嘛!看了中间忘了开头,看到结尾,前面的全忘光了,好烦呀” 小姑娘抱怨起来也是毫不拖泥带水。

“哟,恭喜你,遇到这么极品的 sp 啊。在我的印象里面,经历了两次重构之后,上千行的代码,就那么几个,今天被你遇到了。我看看是哪个”

“原本我以为很简单的一个 AddUpdate, 谁想逻辑这么复杂,牵扯的表也太多了,其中几个表还有上百个字段,这都没法看了” 小 C 的鼠标满屏的乱走,看得我 300 度的眼睛,有些吃力。

“你这一行一个字段,是你自己设置的吧,其实不需要那么格式化,反而更简单。你看啊,一个 Insert 被几十个字段隔成了两屏,容易造成思维停顿。两行搞定的事情,做复杂了。还显得代码量大,失去耐心。”

“那我还原成原先的格式,也有近 900 多行啊,还是多”

“这阅读源代码啊,是有技巧的。我可以分享三点给你。分别是,通读,联想,批评。”

“第一点,通读,非技术性的通读。首先告诉自己,一遍读完就能通晓1000行代码细节,是不可能的事情。读代码前,耐心先行。接着就是开始第一遍的阅读。此时的代码走读,我们不停留在具体的技术末节上,比如 unpivot 的语法是怎么样实现的,为什么有里三层外三层的嵌套,为什么这里用了动态 SQL 去拼接。再比如,XML 的节点铺设,为什么要这么定义,共有多少层。这些留在最后。”

“我们在走读代码的时候,尤其是第一遍,首先要理清的是业务的数据流,比如订单是如何触发的,分别涉及到哪些主体,人,物,财,时间。知道这些数据流分别存在哪些表里,存储的先后顺序是什么,会记录哪些日志。我们的 sp 逻辑结构相对简单,一个事务一个存储过程。所以第一遍,通读,越快了解所有涉及到的业务过程,最重要。你也可以在手边,画画流程图,帮助记忆。”

看着小 C 若有所思的眼神,分明能感觉到她脑子里抽象的拧巴,因此顺手我画了一张上面的流程图。“第一遍走读代码,你能清晰的画出类似上面的图,知道这些数据存在哪里,就足够了。”

“嗯,原来是这样,难怪我老是连接不起来,看过了,脑子里留不下印象!那第二点呢?”

“第二点,需要联想,也就是想象力。看完第一遍,不要急着看第二遍,就在脑子里,回想第一遍的过程。把你认为创建一个订单需要记录的信息给标出来,尽可能详细的在流程图上标准细节,就好比人,在什么时候需要记录人的信息,需要检验人的信息;再比如货,什么时间段,要检查货的库存,要记录货的哪些属性,单价还是 SKU,怎么更新货的库存,更新失败了怎么办?”

“如果你看到长篇的 SQL ,还只停留在脑子里,不靠谱。工作记忆永远只有 15 分钟。读完一遍后,你被叫去开个会,回来你就可能记不清了。所以及时的倾倒出来你刚才读到的 SQL,多问问自己数据是怎么流转下来的,画好流程图,标准自己的想法,越清晰,问题越多,越有利下一遍的阅读...”

"我知道了,我知道了,就是带着问题,主动去寻找答案!"

“理解到位,就是这样。给自己找问题,千万别一遍看完代码,什么都没留下来。接着,你可以去阅读第二遍,第三遍,甚至是第四遍了”

"那还有第三点呢?" 小 C 似乎来劲了。

“第三点最重要,批评。如果你对读到的代码,没有任何要抱怨,没有任何疑惑,那说明还没理解到位。当你看到这些代码,你认为嗯,这段写的很好,这段写的在理,都是这些溢美之词,那完了,你没深入。你可能对 unpivot , cross apply, openXML, OffSet 读到真正实战版代码而感到兴奋,觉得这段 sp 就写的很好,那对 SQL 的认识就太肤浅了。”

“新闻界,会有很多评论家,对重大新闻做二次剖析,比如曹林,《时评写作十讲》的作者,擅长对每篇新闻做双面解析。既讲述原新闻作者的报道手法,也评价原作者的目的与动机,最后还补充自己的观点,非常有意思。”

“在我们编程这个圈子,也有很多书,专讲这方面的。我给你推荐几本吧,《编程珠玑》,《CLR Via C#》, 尤其是 SQL 数据库方面,《数据库索引设计与优化》,《Oracle 优化日记》,《T-SQL Querying》,《T-SQL 性能调优秘籍-基于SQL Server 2012 窗口函数》”

“这些书,非常基础,我自己看过不止一遍。可以快速帮你提高内功。且,书的优点在于,作者就像是代码评论家一样,告诉你为什么 SQL或者代码这么写,不如那样写来的高效,其中的原理是什么。这些都是你在分析具体代码时,可以学到的真正有用的东西。我们应该在任何一段 SQL 中都找到可以学习的地方,最好是找到这段代码的设计弱点,比如子查询嵌套太多,不简洁;比如筛选条件不够优化,需要代码重构,这就是第三点,批评的实质。”

“又推荐书啊,上次推荐的还没看完。”

“书在用时,方恨少。”

本文分享自微信公众号 - 有关SQL(SQLHub),作者:Lenis

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL 的编译原理,了解下?

    一大帮子的开发,窝在一处办公,想想这酸爽,谁见谁愁。L 早已下楼去星巴克加冰了,剩下小 C 在对付 同样焦灼的 Support.

    Lenis
  • 想精通SQL Server, T-SQL的全历史你听过吗?

    早在20世纪70年代,两位年轻人Ray Boyce 和 Donald D. Chamberlin,成功将上帝语言(关系数学)编译为凡人的工具。

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

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

    Lenis
  • 如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效

    发布于 2018-05-29 12:56 更新于 2018-05...

    walterlv
  • Java8新特性时间日期库DateTime API及示例

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    用户1161110
  • Android Q 兼容那些事

    5 月 20 号参加了 Android Q Labs,因此本篇说一说会议的部分内容以及自己的一些想法。

    AndroidTraveler
  • react diff 原理

    React diff 作为 Virtual DOM 的加速器,其算法上的改进优化是 React 整个界面渲染的基础,以及性能提高的保障,同时也是 React 源...

    腾讯IVWEB团队
  • react diff 原理

    React diff 作为Virtual DOM的加速器,其算法上的改进优化是 React 整个界面渲染的基础,以及性能提高的保障,同时也是 React 源码中...

    IMWeb前端团队
  • 开发者都应该了解的SOLID原则(下)

    上一次的文章中我们讲到了开发者都应该了解的SOLID原则中的S和O原则,即:单一功能原则和开闭原则,今天我们继续来了解一下其他三个原则。

    AiTechYun
  • react diff 原理

    本文作者:IMWeb 王少飞 原文出处:IMWeb社区 未经同意,禁止转载 React diff 作为Virtual DOM的加速器,其算法上的改进优...

    IMWeb前端团队

扫码关注云+社区

领取腾讯云代金券