查询超时增加但脚本无法执行

时间:2015-08-29 08:52:36

标签: sql sql-server

当我在远程数据库上执行此脚本时,它会给我查询超时错误。我已经增加了数据库的超时但仍然有此错误。我已经被告知我是否能够优化脚本以使其简单易用。

SELECT TOP 8 MIN( CASE WHEN pic_alb_love.pic=users_pics.pic  

AND pic_alb_love.email =  'try@mail.com' THEN 'User'     ELSE 'Guest'   END)AS answer_one, 

MIN ( CASE WHEN favorites.pic=users_pics.pic  AND favorites.email = 'try@mail.com'  THEN 'good' ELSE 'Bad' 
  END)AS answer2, 

  (CASE WHEN RTRIM (users_pics.upload_type) = 'wow'  THEN 'loaded' ELSE        

  CASE WHEN RTRIM (users_pics.upload_type)= 'hey' THEN 'added' ELSE       

  CASE WHEN RTRIM (users_pics.upload_type) = 'check'  THEN   'Changed'   END END END)as up_ans,     

  (CASE WHEN RTRIM (users_pics.upload_type)  = 'sample1' THEN 'new'  ELSE    

  CASE WHEN RTRIM (users_pics.upload_type)  = 'sample2' THEN 'existing'       ELSE   

  CASE WHEN RTRIM (users_pics.upload_type)  = 'sample3' THEN 'Profile Picture'       END END END) as exs, 

  COUNT(DISTINCT users_pics.pic) as total,RTRIM (users_pics.wardrobe) as wardrobe, 



 fname,users_pics.wardrobe,

  MIN (make)as make,MIN (htags)as htags,  RTRIM (profile.profile_id) as profile_id,

  users_pics.email,profile.profile_pix, RTRIM (profile.gender) as gender, 

  users_pics.time_group,profile.fpage,up_user_id, MIN (u_pic_id) as u_pic_id, MIN (users_pics.pic) as pic
FROM users_pics 

LEFT join profile on users_pics.email = profile.email  

LEFT join favorites on users_pics.pic = favorites.pic  

LEFT JOIN pic_alb_love on users_pics.pic = pic_alb_love.pic 

left join friends on users_pics.email = friends.resp_email


WHERE req_email = 'try@mail.com' and pic_enable='enable' or pic_view='Public'  

GROUP BY users_pics.upload_type,profile.fname,profile.profile_id,users_pics.wardrobe, 

users_pics.email, profile.gender,users_pics.time_group,profile.profile_pix, profile.fpage,up_user_id


ORDER BY MIN (users_pics.u_pic_id) DESC

1 个答案:

答案 0 :(得分:0)

增加超时可能有所帮助,但您还应该检查您的查询是否被其他操作(如INSERT / UPDATE或open transaction)阻止。

最简单的方法是安装和使用sp_whoisactive程序。

其次,您不需要像以前那样嵌套CASE:

(CASE WHEN RTRIM (users_pics.upload_type) = 'wow'  THEN 'loaded' ELSE        

  CASE WHEN RTRIM (users_pics.upload_type)= 'hey' THEN 'added' ELSE       

  CASE WHEN RTRIM (users_pics.upload_type) = 'check'  THEN   'Changed'   END END END)as up_ans,  

CASE RTRIM (user_pics.upload_type)
WHEN 'wow'   THEN 'loaded'
WHEN 'hey'   THEN 'added'
WHEN 'check' THEN 'changed'
ELSE NULL   /* or your value like 'unknown' */
END AS up_ans

接下来的事情:你RTRIM几乎在每个字符串值上,你应该在插入过程中清理你的输入,除非你需要空格/制表符/换行符等等。 这样您的查询就不需要RTRIM,并且如果存在则可以使用索引。

/* New values */
INSERT INTO table_name(...) VALUES  (LTRIM(RTRIM(value...)))

/* Existing ones */
UPDATE table_name
SET col = LTRIM(RTRIM(col))

SQL Parser将理解文本墙,人类将需要时间来完成它。

我知道我们可以争论代码风格,但记住你为人们编写代码。良好的可读代码可以让您更早地发现错误,并且您和您的继任者将来更容易维护:

1)一行选定值

2)SELECT和GROUP BY中的相同顺序

3)末尾的聚合列

4)您可以使用不需要完全限定名称的别名

5)没有不明确的列名,总是指定从哪个表

6)SQL语法UPPER CASE

7)对齐您的代码

您的查询更具人性化可读性:

SELECT TOP 8  
   [up_user_id]   /* Always add from which table even if it is unique column name, because in future you may get ambigous column */
  ,[fname]
  ,[profile_id] = RTRIM(profile.profile_id)
  ,[up_ans]     = CASE RTRIM(users_pics.upload_type)
                    WHEN 'wow'   THEN 'loaded'
                    WHEN 'hey'   THEN 'added'
                    WHEN 'check' THEN 'changed'
                    ELSE NULL
                  END
  ,[exs]        = CASE RTRIM(users_pics.upload_type) 
                    WHEN 'sample1' THEN 'new'
                    WHEN 'sample2' THEN 'existing'
                    WHEN 'sample3' THEN 'Profile Picture'
                    ELSE NULL
                  END
  ,[wardrobe]       = RTRIM(users_pics.wardrobe)
  ,users_pics.email
  ,[gender]         = RTRIM(profile.gender)
  ,users_pics.time_group
  ,profile.profile_pix
  ,profile.fpage
  ,[answer_one]     = MIN(CASE 
                            WHEN pic_alb_love.pic=users_pics.pic THEN 'User'
                            ELSE 'Guest'
                          END)
  ,[answer2]        = MIN(CASE
                            WHEN favorites.pic = users_pics.pic  AND favorites.email = 'try@mail.com' WHEN 'good' 
                            ELSE 'Bad'
                         END)
  ,[total]          = COUNT(DISTINCT users_pics.pic)
  ,[make]           = MIN(make)
  ,[htags]          = MIN(htags)
  ,[u_pic_id]       = MIN(u_pic_id)
  ,[pic]            = MIN(users_pics.pic)
FROM users_pics     /* you can use alias like AS up */
LEFT JOIN profile
   ON users_pics.email = profile.email  
LEFT JOIN favorites 
   ON users_pics.pic   = favorites.pic  
LEFT JOIN pic_alb_love
   ON users_pics.pic   = pic_alb_love.pic 
LEFT JOIN friends
   ON users_pics.email = friends.resp_email
WHERE 
        req_email  = 'try@mail.com'
    AND pic_enable = 'enable'
    OR  pic_view   = 'Public'  
GROUP BY                     
     up_user_id
    ,profile.fname
    ,profile.profile_id
    ,users_pics.upload_type
    ,users_pics.wardrobe
    ,users_pics.email
    ,profile.gender
    ,users_pics.time_group
    ,profile.profile_pix
    ,profile.fpage
ORDER BY MIN(users_pics.u_pic_id) DESC

在选择数据时检查您的查询是否被阻止后,您可以考虑:

  • 检查表格上的索引
  • 添加WHERE条件以获取较小的集合,也许您可​​以使用一些update_date > current_date - 2 weeks
  • 想要优化查询,因为它现在需要时间来完成分组和排序。
  • 您的WHERE条件,您确定它不应该是:

 WHERE (req_email  = 'try@mail.com'
 AND pic_enable = 'enable')
 OR  pic_view   = 'Public'