我有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。
我想知道一些替补。
答案 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的临时表,然后将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
答案 2 :(得分:1)
到目前为止我上网了,IN显示性能缓慢...我建议使用两个表的JOIN ...其中第一个表是要更新的表,第二个表是临时表拥有所有Id值...
那么你的UPDATE查询会是这样的
UPDATE tProfile tp
INNER JOIN IdTable it ON tp.Id = it.Id
SET LastActivity=@DateTimeNow
WHERE UserId=@UserId