2015-08-29 54 views
-1

当我在远程数据库上执行此脚本时,它给我提供查询超时错误。我增加了数据库的超时时间,但仍然存在此错误。我被告知如果我能够优化脚本,使其变得简单,它可能会工作。查询超时增加,但脚本执行失败

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

AND pic_alb_love.email = '[email protected]' THEN 'User'  ELSE 'Guest' END)AS answer_one, 

MIN (CASE WHEN favorites.pic=users_pics.pic AND favorites.email = '[email protected]' 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 = '[email protected]' 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 
+0

请确保您的查询未被阻止,您可以选择它查询DMV或安装'sp_whoisactive' – lad2025

回答

0

增加超时可以提供帮助,但是您还应该检查您的查询是否未被其他操作(如INSERT/UPDATE或打开事务)阻止。

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

第二你不需要窝案像你这样:

(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几乎在每一个字符串值,你应该插入过程中净化你的输入,除非你需要空格/制表符/换行符等等。 这样你的查询将不需要0​​,并可以利用索引,如果存在任何。

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

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

SQL解析器会明白墙上的文字的,人类将需要时间来做到这一点。

我知道我们可以争论代码风格,但请记住您为人们编写代码。好可读的代码让你更早发现错误,这是一个地狱更容易在未来保持你和你的继任者:

1)一个选择的值一行

2)选择和分组顺序相同BY

3)在结束

4)汇总列可以使用别名不需要完全合格的名称

5)没有明确的列名称,始终指定从哪个表

6)SQL语句大写字母

7)Allign代码

你的查询更可读来源:

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 = '[email protected]' 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 = '[email protected]' 
    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 = '[email protected]' 
AND pic_enable = 'enable') 
OR pic_view = 'Public'