use*_*216 2 sql t-sql sql-server-2008 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'
Run Code Online (Sandbox Code Playgroud)
Table1有12000行,连接中的select只有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';
Run Code Online (Sandbox Code Playgroud)
首先,您需要将第一行更改为:
UPDATE p
Run Code Online (Sandbox Code Playgroud)
当您在from子句中定义别名时,您需要update在正确的事情中使用它.(我希望您的查询在SQL Server中生成错误,但它不会.)
要优化此查询,您需要添加索引.我会建议这两个:
Table1(date, EmplID)
Table2(EmplId, Start)
Run Code Online (Sandbox Code Playgroud)
然后,您可能会发现相关子查询版本更快,特别是如果该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';
Run Code Online (Sandbox Code Playgroud)
但是,我怀疑p对比table1是你的性能问题的根源.
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |