從SQL Server 佇列進行並發處理
將資料表用作佇列時,將其配置為由多個客戶端並發處理可能會很困難。如果沒有正確的配置,多個工作執行緒可能會嘗試處理同一行,導致爭用。
樂觀並發控制:
提供的查詢最初嘗試獲取悲觀鎖位於要處理的行上,只允許一名工作人員訪問它。但是,這種方法可能會導致大量等待並降低並發性。
使用輸出子句的悲觀並發控制:
SQL Server 2005 引入了OUTPUT 子句,它允許更多高效的悲觀並發:
with CTE as ( SELECT TOP(1) COMMAND, PROCESSED FROM EXAMPLE_TABLE WITH (READPAST) WHERE PROCESSED = 0 ) UPDATE CTE SET PROCESSED = 1 OUTPUT INSERTED.*;
此查詢使用以下指令尋找第一個未處理的行READPAST 提示,忽略任何鎖定的行。然後更新該行,將 PROCESSED 設定為 1。 OUTPUT 子句傳回更新後的行,該行由用戶端處理。
表格配置:
要最佳化此方法中,資料表的結構應使用 PROCESSED 欄位作為聚集索引的第一列。這確保了行按處理狀態排序。
聚集索引和非聚集索引:
雖然可以考慮在 ID 欄位上使用非聚集索引,但它通常不建議用於頻繁使用的佇列。這是因為非聚集索引會帶來額外的開銷和複雜性。
查詢限制:
為了獲得最佳效能,查詢團隊清單應僅限於 Dequeue 操作,避免 Peek 操作或將表用於排隊和資料儲存目的。
以上是如何有效率地處理 SQL Server 團隊清單的同時處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!