MSSQL快速更新

时间:2012-11-09 11:00:23

标签: c# sql-server optimization query-optimization

我有Sql-query ike this:

UPDATE tProfile SET LastActivity=@DateTimeNow WHERE UserId=@UserId AND Id IN ({0})

{0} - 这是id的刺痛,例如:

UPDATE tProfile SET LastActivity=@DateTimeNow WHERE UserId=@UserId AND Id IN (1155,1684,41368)

这个字符串可以有几千个Id。

我如何更容易地执行此查询,因为此查询使用100%CPU。

我想知道一些替补。

3 个答案:

答案 0 :(得分:2)

如果您的ID是逗号分隔列表,那么您可以使用split function(UDF)将它们插入表变量然后更新。

DECLARE @IdTable TABLE (Id INT)
INSERT INTO @IdTable SELECT Id FROM dbo.SplitFunction(@IdList,',')

UPDATE p SET p.LastActivity = @DateTimeNow
FROM tProfile p INNER JOIN @IdTable i
  ON p.Id = i.Id
WHERE p.UserId = @UserId

答案 1 :(得分:1)

您可以创建一个包含这些ID的临时表,然后将UPDATEJOIN一起创建到此表中。类似的东西:

UPDATE t1
SET t1.LastActivity=@DateTimeNow 
FROM tProfile t1
INNER JOIN
(
    SELECT 1115 Id
    UNION ALL
    SELECT 1684
    UNION ALL
    SELECT 41368
    ...
) t2 ON t1.UserId = t2.Id

答案 2 :(得分:1)

到目前为止我上网了,IN显示性能缓慢...我建议使用两个表的JOIN ...其中第一个表是要更新的表,第二个表是临时表拥有所有Id值... 那么你的UPDATE查询会是这样的 UPDATE tProfile tp INNER JOIN IdTable it ON tp.Id = it.Id SET LastActivity=@DateTimeNow WHERE UserId=@UserId