2


1

同じステートメントでSQL Serverを選択して更新しますか?

次のようなSQLクエリがあります。

SELECT TOP (@TopType) AdvertID, IsAdvertImage, AdvertData
FROM Adverts
WHERE AdvertSize = @AdvertSize
ORDER BY NEWID()

テーブルAdvertsの各行にはViewsという列もありますが、フェッチされたバナーのビューを1増やすことは可能ですか? そこで、TopTypeを4に設定して4つのバナーを取得します。これらのバナーの表示は1ずつ増加しているため、バナーが表示された回数を追跡できます。

1 Answer


5


WITH cte AS (
 SELECT TOP (@TopType)
 AdvertID, IsAdvertImage, AdvertData, Views
 FROM Adverts
 WHERE AdvertSize = @AdvertSize
 ORDER BY NEWID())
UPDATE cte
 SET Views = Views + 1
OUTPUT INSERTED.AdvertID
 , INSERTED.IsAdvertImage
 , INSERTED.AdvertData;

しかし、ORDER BY NEWID()は恐ろしいパフォーマンスを発揮します。 TOP(1)でも、テーブル全体をスキャンし、選択した列をtempdbにスプールし、ソートし、そこからTOPを取得する必要があります。 また、Views = Views + 1 X-lockとフルスキャンS-locksの間の更新の競合の大当たりになるでしょう…​