我有一个像这样的SQL查询:
SELECT TOP (@TopType) AdvertID, IsAdvertImage, AdvertData
FROM Adverts
WHERE AdvertSize = @AdvertSize
ORDER BY NEWID()
表格广告中的每一行还有一个名为“视图”的列,是否可以为已获取的横幅增加1的视图?所以我将TopType设置为4并获得4个横幅,这些横幅的视图增加了1,这样我就可以跟踪横幅显示的次数。
答案 0 :(得分: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-lock之间的更新冲突富矿......