SQL优化经验

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 14:09 点击:

很长时间没有搞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来代码,这样代码会精简一些。

 

    &nb

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • sql常见面试题
      • SQL SERVER 2005性能之跟踪
      • SQL编程(一)
      • LINUX上RMAN自动备份脚本
      • sql server面试题
      • 如何将多个SQL查询统计结果一次显示出来
      • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
      • sql server 列转行
      • SQL小技巧系列 --- 行转列合并
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1