使用SQL Server 作為並發多個客戶端處理的資料庫隊列
跨多個客戶端同時有效處理隊列中的命令的能力是使用SQL Server 作為資料庫佇列時不可或缺。為了實現這一點,必須實現某些配置和查詢最佳化。
一種方法涉及使用帶有以下查詢的悲觀鎖:
select top 1 COMMAND from EXAMPLE_TABLE with (UPDLOCK, ROWLOCK) where PROCESSED=false;
但是,此策略可能會導致多個之間的爭用工作人員嘗試獲取相同的行鎖。更有效的解決方案是利用 SQL Server 2005 中引入的 OUTPUT 子句。
OUTPUT 子句允許原子出隊操作。它有助於在單一操作中找到適當的行、跳過鎖定的行以及將所選行標記為出列:
with CTE as ( SELECT TOP(1) COMMAND, PROCESSED FROM TABLE WITH (READPAST) WHERE PROCESSED = 0) UPDATE CTE SET PROCESSED = 1 OUTPUT INSERTED.*;
為了獲得最佳效能,使用最左側的聚集索引鍵建構表至關重要已處理列。如果 ID 作為主鍵存在,則應將其移至聚集鍵中的第二列。此外,建議避免在佇列上使用非聚集索引。
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
此外,重要的是要避免使用表格進行檢視操作或同時用作佇列和儲存。這些做法可能會導致死鎖並降低吞吐量。
透過遵守原子出隊流程、利用 READPAST 提示並實現正確結構化的表,在使用 SQL Server 時可以在極其並發的負載下實現高吞吐量作為具有多個客戶端的資料庫佇列。
以上是SQL Server 如何有效率地處理跨多個客戶端的並發佇列處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!