2015-11-04 95 views
1

我有一个更新查询可以正常工作,但速度太慢,需要2分钟才能完成。有没有另外一种方法可以编写这个查询来加速它?这里是我的代码感谢:如何加快SQL Server 2012中缓慢更新查询的速度

UPDATE #tmpIMDS 
SET 
    ModelFileName = b.ModelFileName,  
    SendEMail = b.SendEMail 
FROM 
(
    SELECT DISTINCT 
     IMDSConversionReportData.ModelNumber, 
     ModelFileName, 
     'Send Email' AS SendEmail  
    FROM 
     IMDSConversionReportData,   
     (
      SELECT DISTINCT 
       ModelNumber, 
       Max(DateAdded) AS DateAdded    
      FROM 
       IMDSConversionReportData    
      GROUP BY 
       ModelNumber) a  
      WHERE 
       IMDSConversionReportData.ModelNumber = a.ModelNumber 
       AND IMDSConversionReportData.DateAdded = a.DateAdded 
     ) b 
     WHERE ModelID = b.ModelNumber 

回答

2

而是击中IMDSConversionReportData表两次以每ModelNumber最大DateAdded可以生成row_number识别每ModelNumber最大DateAdded列。

同时删除distinct当你与group by这是毫无意义的选择只有一个非聚集列

试试这个

;WITH cte 
    AS (SELECT *, 
       'Send Email' AS SendEmail, 
       Row_number()OVER(partition BY ModelNumber ORDER BY DateAdded DESC) AS rn 
     FROM IMDSConversionReportData) 
UPDATE t 
SET ModelFileName = c.ModelFileName, 
     SendEMail = c.SendEMail 
FROM #tmpIMDS t 
     INNER JOIN cte c 
       ON t.ModelID = c.ModelNumber 
Where Rn = 1 

注:始终使用正确的INNER JOIN语法来连接两个表,而不是老样式逗号分隔连接。我们总是发现INNER Join语法更可读。将过滤器单独保存在Where子句中

+0

无法绑定多部分标识符“b.ModelFileName”。 无法绑定多部分标识符“b.SendEMail”。 – ChrisPasa

+0

我得到那些erorrs – ChrisPasa

+0

@ChrisPasa - 更新检查现在 –