[英]How to create a queue like structure in SQL Server
有没有在SQL Server中创建类似队列的好方法?
要求:
一个简单的标识列适用于需求1和2,但是我将如何处理3?
我最终从@ roger-wolf实施了解决方案。一个区别是,我使用触发器而不是存储过程来重新编号。 这是我的触发代码:
CREATE TRIGGER [dbo].[TR_Queue]
ON [dbo].[Queue]
AFTER INSERT, DELETE, UPDATE
AS
BEGIN
SET NOCOUNT ON;
-- Get the current max value in priority
DECLARE @maxPriority INT = COALESCE((SELECT MAX([priority]) FROM [dbo].[Queue]), 0);
WITH newValues AS (
-- Renumber by priority, starting at 1
SELECT [queueID]
,ROW_NUMBER() OVER(ORDER BY [priority] ASC) AS [priority]
FROM (
-- Pretend all nulls are greater than previous max priority
SELECT [queueID]
,COALESCE([priority], @maxPriority+1) AS [priority]
FROM [dbo].[Queue]
) AS tbl
)
UPDATE q
SET q.[priority] = newValues.[priority]
FROM [dbo].[Queue] AS qroger-wolf
INNER JOIN newValues
ON q.[queueID] = newValues.[queueID]
END
这对我来说效果很好,因为队列总是相对较小且不经常更新,因此我不必处理触发器的性能。
使用float
列进行优先级排序,并使用类似于Celko树的方法:
row_number()
而不是float值; 我在这里看到的唯一缺陷是,当队列中的第N个项目既不是第一个也不是最后一个时,要找到它要困难一些。 如果您不需要它,则该方法应该有效。
您可以添加类型为DateTime
的Priority
列,然后将某行设置为优先级行时,在Priority
列中设置当前日期时间,然后order by
条件将其用作order by
一部分?
我在过去的项目中有类似的要求,我做了什么(并且奏效了):
datetime2
update_at_utc
列 update_at_utc = GETDATEUTC()
update_at_utc
排序 update_at_utc
的平均值,然后使用它来设置要移动的行的update_at_utc
。 注1:第4点假设插入和上下移动队列的频率使得datetime2类型具有足够的分辨率。 例如,如果您以1毫秒的间隔插入2行,然后尝试在这2行之间移动1000行,则datetime2分辨率将不足( https://docs.microsoft.com/zh-cn/sql/t-sql / data-types / datetime2-transact-sql?view = sql-server-2017 )。 在这种情况下,行在队列中的上/下移动将更加复杂。 当移动N行时,请降低位置:
update_at_utc
分配给上一行的update_at_utc
update_at_utc
分配到上面第1点中记住的日期。 注意2:我建议使用UTC日期而不是本地日期,以避免在夏令时期间出现问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.