我有一个存储任务队列的表。每项任务都如下:
Id | Operation | Argument | Status
操作是字符串
参数是单个数字
状态为以下之一:Queued
,Busy
,Complete
,Failed
我需要弄清楚队列中某个项目的位置,但需要跳过未排队的任务。
示例:
1 A 5 Queued -- 1
2 A 6 Queued -- 2
3 B 3 Busy -- x
4 B 4 Complete -- x
5 A 8 Queued -- 3
--
位置x
之后的预期位置意味着请求毫无意义。
问题:计算这种位置的好方法是什么?
目前我这样做:
SELECT TOP 1 p.Position FROM
(
SELECT Id, Status,
ROW_NUMBER() over (order by Id) as Position
from QueuedJobs where Status = 0 AND Id <= @taskId
) as p
order by Position desc
英文:根据我的任务计算每项任务的位置,并给我最后的位置(这是我的任务)
我关注的是表现,假设我有1000条记录并且有很多请求(每秒100次) 数据库是SQL Server 2008
答案 0 :(得分:1)
没有order by子句的查询可以按任何顺序返回行。使用什么标准来排序不忙或已完成的排队请求?它是FIFO队列吗?最老的请求是在顶部?通常,日期时间值用于此目的。在任何情况下,我都会按照前端查询返回的顺序对行进行编号,这样可以更有效地完成。
答案 1 :(得分:0)
如果状态0表示“已排队”,则:
Select Count(*)
From QueuedJobs
Where Status = 0
and Id <= @taskId
应该告诉你你在哪里:)