sql - 加入更新需要很长时间

标签 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 行,连接内的选择只有 51 行,但更新大约需要 2 分钟,但如果我删除 where clase p.date = '2050-12-31',更新时间不到第二。而且我不知道如何解决它。我正在使用 SQL Server 2008。

两个表都没有索引。

最佳答案

这是您的查询:

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 是性能问题的根源。

关于sql - 加入更新需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25494933/

相关文章:

sql - Postgresql 文本数组获取行不喜欢某个值?

sql-server - 转义单引号的环卫怎么能被SQL Server中的SQL注入(inject)打败呢?

sql - OHCL(开-高-低-闭)T-SQL 查询

mysql - 从表中的外键映射值

mysql - SQL 日期范围 - 如果没有提供起点则选择全部?

sql - 如何选择使用 IDENTITY_INSERT 或在单个语句中提供 IDENTITY_INSERT

sql-server-2008 - 普适 SQL ADO.NET 数据提供程序

mysql - 替换从左外连接返回的默认空值

sql-server - 我有一个 View 在执行时运行良好,但是当我尝试在设计模式下打开它时,它会引发解析错误

sql - 如何编写 SQL 查询来操作 2 个表之间的数据?