[英]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.