使用join进行更新需要很长时间

时间:2014-08-25 21:52:35

标签: sql sql-server-2008 tsql database-performance

我在更新表时遇到问题。我正在运行以下查询:

UPDATE Table1 SEt entrena = c.Count 
FROM Table1 AS p INNER JOIN (
SELECT e.EmplID, COUNT(e.EmplID ) as Count 
FROM Table2 AS e WHERE e.Start >= @Start AND e.Start <=@End 
GROUP BY e.EmplID ) AS c ON p.EmplID = c.EmplID
WHERE P.Date  = '2050-12-31'

Table1有12000行,连接中的select只有51行,但更新大约需要2分钟,但是如果我删除了where clase p.date =&#39; 2050-12-31&#39;更新只需不到一秒钟。我无法弄清楚如何解决它。我使用的是SQL Server 2008。

两个表都没有索引。

1 个答案:

答案 0 :(得分:6)

这是您的查询:

UPDATE Table1
    SET entrena = c.Count 
    FROM Table1 p INNER JOIN
         (SELECT e.EmplID, COUNT(e.EmplID ) as Count 
          FROM Table2 e
          WHERE e.Start >= @Start AND e.Start <=@End 
          GROUP BY e.EmplID
         ) c
    ON p.EmplID = c.EmplID
    WHERE P.Date  = '2050-12-31';

首先,您需要将第一行更改为:

UPDATE p

from子句中定义别​​名时,需要在update中使用该别名才能正确发生。 (我希望您的查询在SQL Server中生成错误,但它没有。)

要优化此查询,您需要添加索引。我会建议这两个:

Table1(date, EmplID)
Table2(EmplId, Start)

然后您可能会发现相关子查询版本更快,特别是如果where子句具有高选择性:

UPDATE p
    SET entrena = (SELECT COUNT(e.EmplID ) as Count 
                   FROM Table2 e
                   WHERE e.Start >= @Start AND e.Start <=@End AND
                         p.EmplID = e.EmplID
                  )
    FROM Table1 p
    WHERE P.Date  = '2050-12-31';

但是,我怀疑ptable1是您性能问题的根源。