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)を使用してIDをテーブル変数に挿入し、更新することができます。

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

これらの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 に答える
1

ネットサーフィンをしている限り、INのパフォーマンスは遅いです...2つのテーブルのJOINを使用することをお勧めします...ここで、最初のテーブルは更新されるテーブルで、2番目のテーブルはすべてを保持する一時テーブルです。 Id値...すると、更新クエリは次のようになります。 UPDATE tProfile tp INNER JOIN IdTable it ON tp.Id = it.Id SET LastActivity=@DateTimeNow WHERE UserId=@UserId

于 2012-11-09T11:23:44.913 に答える