4

我有这样的 Sql 查询:

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。

我想知道一些替代品。

4

3 回答 3

2

如果您的 ID 是逗号分隔的列表,那么您可以使用拆分函数(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
于 2012-11-09T11:15:01.950 回答
1

就我上网而言,IN 显示性能很慢...我建议使用两个表的 JOIN... 其中第一个表将是要更新的表,第二个表将是保存所有表的临时表Id 值...然后你的 UPDATE 查询看起来像 UPDATE tProfile tp INNER JOIN IdTable it ON tp.Id = it.Id SET LastActivity=@DateTimeNow WHERE UserId=@UserId

于 2012-11-09T11:23:44.913 回答
1

您可以创建一个包含这些 id 的临时表,然后UPDATE使用JOIN该表。就像是:

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
于 2012-11-09T11:05:10.803 回答