随笔 - 289  文章 - 1  评论 - 2716  阅读 - 195万

给大家分享一个SQL优化经验

      很长时间没有搞SQL了,最近又回归原始,有一个优化的经验和大家分享下。

      

      看下面一个查询,这是查询学生数据的逻辑,逻辑比较有点乱,这个查询跑30分钟也不会出结果,一执行CPU立马100%,虽然是个虚似机,但也不至于这种查询也对付不了,肯定有优化的地方。
   

复制代码
 SELECT  *        FROM 学生表 WITH(NOLOCK) WHERE
         (FromSys 
IS NULL OR 
         (
            (FromSys
<>'A' AND FromSys<>'B' AND FromSys<>'C'OR
(
 (FromSys
='A' OR FromSys='B' OR FromSys='C'
   
AND FromSysID NOT IN(SELECT OriginID FROM 学生表 WITH(NOLOCK) WHERE DataFlag=0)
 )
)
     )
复制代码


 
     上面的代码看起来有点乱,其实整理一下,条件就是三类:
    1:FromSys IS NULL。
    2:FromSys<>'A' AND FromSys<>'B' AND FromSys<>'C'。
    3:(FromSys='A' OR FromSys='B' OR FromSys='C')  AND FromSysID NOT IN(SELECT OriginID FROM 学生表 WITH(NOLOCK) WHERE DataFlag=0)
 )


    优化点如下:
    第一:把上面的第一个和第二个条件or换成union all,主要是因为过多的or查询,有可能会引起表扫描,致使性能下降,这里就不做比较了。
    第二,把第三个or里面的not in 用left join 代替,这种写法还要感谢我上家公司的DBA,他们教会我不少SQL知识,嘿嘿。
          left join sql:
          

复制代码
SELECT COUNT(*FROM (   
        
SELECT  *
        
FROM 学生表 WITH(NOLOCK) WHERE   
     FromSys 
IN ('A','B','C' )
    
       ) 
AS tem LEFT JOIN dbo.学生表 s2 ON tem.FromSysID=s2.OriginID AND s2.DataFlag=0
       
WHERE s2.FromSysID IS null 
复制代码


                下面是left join的执行计划图,很清晰,很简单。


         

 

         not in sql:
            

SELECT COUNT(*FROM  学生表 WITH(NOLOCK) WHERE  
        (FromSys
='A' OR FromSys='B' OR FromSys='C'
       
AND FromSysID NOT IN(SELECT OriginID FROM 学生表 WITH(NOLOCK) WHERE DataFlag=0)

 

          下面是not in的执行计划图,复杂得多,而且有多个嵌套查询。

          
    第三:创建相应索引,其实对于非专业DBA,有时不太容易去优化SQL语句,但目前sql 2008有一个特别简单的功能,可以从预估执行计划中得出需要创建的索引,我们参考一下就行:

 

                                 
   

       第四:如果一个条件中过多的or,例如:FromSys='A' OR FromSys='B' OR FromSys='C',可以用in来代码,这样代码会精简一些。

 

      效果:最终使执行30分钟都无结果的操作,控制下几秒内完成,不可思议啊,继续学习。

posted on   min.jiang  阅读(4636)  评论(11编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2011年7月 >
26 27 28 29 30 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

点击右上角即可分享
微信分享提示