博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

给上家公司的一点建议 二

Posted on 2020-10-10 15:40  菠萝  阅读(128)  评论(0编辑  收藏  举报

文章开始之前给大家介绍下我非常讨厌的角色:

 

 

 

没错就是文丑丑!

 

本文就用文丑丑来,来回忆和前公司技术主管关于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 我哭了

 算了,写不下去了,事情都过去了 翻篇了。