文章开始之前给大家介绍下我非常讨厌的角色:
没错就是文丑丑!
本文就用文丑丑来,来回忆和前公司技术主管关于sql优化的争辩吧。
大致经过是这样的:我由于公司项目业务相关表(MSSQL)比较多,在做某些业务统计的时候,我用到了 T-SQL with As ,我用此的目的最简单不过:就是在不影响效率的前提下将sql写得更容易看懂。但是在公司任职末期,文丑丑多次找事给我扣些莫须有的帽子。污蔑我写的SQL效率低、sql代码复杂。
下面我分享几个文丑丑项目使用的sql,即:他们认为的优秀sql
案例一:
个人愚见:
1、Exists 和 Top 这里不觉得有点累赘么?
虽然Exists和Top作用不同,但这里完全可以只用一个命令 就打到相同效果,而且使得SQL简单
后来我在网上查阅到,也有人讨论过这个话题:https://sqlinthewild.co.za/index.php/2011/04/05/to-top-or-not-to-top-an-exists/
2、这里声明SQL变量,没必要,反而增加SQL脚本复杂度和SQL服务器运算压力
直接 if》》》select 1 。。。else》》》select 0 不是更简洁么
3、多个OR条件,何不改用 union all 这样不是更直观,重要的是效率有提升
4、避免不必要的SQl运算
如上sql,如果第一个条件满足了,则不关心第一个OR中的计算结果,同理第二个OR的计算结果也不关心。然后截图中的写法 ,每次都要运算三个次,这样显然不是明智的
5、不会犯低级错误:表别名用 A、B、C 这些
6、SQL 条件 A is not null And A <>0, 同时存在时前者是累赘
只有 A<>0 返回的 A 必定是 not null
如果是我,我会这样写:
if exits (A情况) begin select 1; //存在 return; end if exits (B情况) begin select 1; //存在 return; end if exits (C情况) begin select 1; //存在 return; end select 0 ;//不存在
案例二、 大量这样的统计sql
只能说,这样的sql能让业务展示正确全靠运气! 一看就没搞懂 cross join 和cross apply的区别。
案例三 当让我去维护这样一个sql 我哭了
算了,写不下去了,事情都过去了 翻篇了。