码迷,mamicode.com
首页 > 数据库 > 详细

SQL 优化实战

时间:2018-04-11 18:15:00      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:exist   user   into   实战   情况   levels   四种   表数   大量   

背景:从一堆用户中取出部分符合要求用户的ID转化为字符串并排形式,假设共取1000个。

方案一:新建临时表,在对临时表数据进行操作。总共有4中情况,需要创建四次临时表,多次判断

1   DECLARE @UserCount1 INT    --VIP等级大于28的用户数
2     SELECT T.UserID INTO #TempTableOf28
3     FROM GAMECENTERLINKEDSERVER.GameCenter.LevelSystem.VIP_UserGrade  VG ,#TempTable T
4     WHERE VG.UserID = t.UserID  AND VG.Grade>=28  ORDER BY VG.Grade DESC           --倒叙,高VIP等级优先获奖
5     SELECT @UserCount1=COUNT(UserID) FROM #TempTableOf28
1    DECLARE @StringUserID1 VARCHAR (max) 
2    SET @StringUserID1=‘‘  
3     IF EXISTS(SELECT  1 FROM  #TempTableOf28 ) AND @UserCount1<=1000  --VIP等级大于28,要么不足1000,要么直接取完,取完改@DrawCount=0,不再执行其他部分
4       SELECT  @StringUserID1=@StringUserID1+,+CAST(UserID AS VARCHAR) FROM #TempTableOf28
5     ELSE IF EXISTS(SELECT 1 FROM  #TempTableOf28 ) AND @UserCount1>1000
6       SELECT TOP 1000  @StringUserID1=@StringUserID1+,+CAST(UserID AS VARCHAR) FROM #TempTableOf28

小结:有四种情况需要创建四个临时表,判断结构中直接把相应的部分转换为字符串结构。

方案二:不使用临时表,优化判断结构

 1 IF (SELECT COUNT(1) FROM @vip)<=1000
 2     INSERT INTO @UsersLast
 3     SELECT UserID FROM @vip
 4 ELSE IF (SELECT COUNT(1) FROM @vip WHERE Vip>=28)>=1000
 5     INSERT INTO @UsersLast
 6     SELECT TOP 1000 UserID FROM @vip WHERE vip>=28
15 ELSE
16     INSERT INTO @UsersLast
17     SELECT TOP 1000 UserID FROM @vip
18     ORDER BY vip DESC

小结:直接写入表,判断结构清晰,最后再将相关表直接转换为符合要求的类型。

总结:两种方式均可完成需求,但第一种不仅仅大量使用临时表,而且产生大量重复代码,代码整合度也很低。从接口整体情况来看,第一种方案的代码是第二种的三倍之多。效率相比可见一斑。so,优化之路路漫漫其修远兮~

 

SQL 优化实战

标签:exist   user   into   实战   情况   levels   四种   表数   大量   

原文地址:https://www.cnblogs.com/zhangrenzhi/p/8797038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!