给大家分享一个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) ) ) )
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
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的执行计划图,复杂得多,而且有多个嵌套查询。
第四:如果一个条件中过多的or,例如:FromSys='A' OR FromSys='B' OR FromSys='C',可以用in来代码,这样代码会精简一些。
效果:最终使执行30分钟都无结果的操作,控制下几秒内完成,不可思议啊,继续学习。 |
|
来自: 唐伯龙 > 《SQLServer》