Pat*_*ick 2 sql-server select sql-server-2008
我有一个像这样的SQL查询:
SELECT TOP (@TopType) AdvertID, IsAdvertImage, AdvertData
FROM Adverts
WHERE AdvertSize = @AdvertSize
ORDER BY NEWID()
Run Code Online (Sandbox Code Playgroud)
表格广告中的每一行还有一个名为"视图"的列,是否可以为已提取的横幅增加1的视图?所以我将TopType设置为4并获得4个横幅,这些横幅的视图增加了1,这样我就可以跟踪横幅显示的次数.
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;
Run Code Online (Sandbox Code Playgroud)
但是ORDER BY NEWID()会表现得很糟糕.即使TOP(1)仍然需要扫描整个表,在tempdb中对所选列进行假脱机,排序,从中取出TOP.并且还将成为Views = Views + 1 X-lock和全扫描S-lock之间的更新冲突富矿......
| 归档时间: |
|
| 查看次数: |
1521 次 |
| 最近记录: |