sql-使用数据库表作为队列
我想将数据库表用作队列。 我想在其中插入并按插入顺序(FIFO)从中获取元素。 我主要考虑的是性能,因为每秒我有成千上万的交易。 因此,我想使用一个SQL查询,该查询为我提供第一个元素,而无需搜索整个表。 阅读时我不会删除任何行。SELECT TOP 1 .....在这里有帮助吗?我应该使用任何特殊索引吗?
9个解决方案
31 votes
我将使用IDENTITY字段作为主键来为每个排队的项目提供唯一递增的ID,并在其上粘贴聚簇索引。 这将代表项目排队的顺序。
为了在处理项目时将项目保留在队列表中,您需要一个“状态”字段来指示特定项目的当前状态(例如0 =正在等待,1 =正在处理,2 =已处理)。 这是为了防止某个项目被处理两次。
处理队列中的项目时,您需要在表格中找到当前未处理的下一个项目。 这将需要以一种方式进行,以防止多个流程拾取同一项目同时进行处理,如下所示。 请注意,表提示UPDLOCK和READPAST在实现队列时应注意。
例如 在存储过程中,如下所示:
DECLARE @NextID INTEGER
BEGIN TRANSACTION
-- Find the next queued item that is waiting to be processed
SELECT TOP 1 @NextID = ID
FROM MyQueueTable WITH (UPDLOCK, READPAST)
WHERE StateField = 0
ORDER BY ID ASC
-- if we've found one,