Jag rekommenderar att du går igenom Använda tabeller som köer. Korrekt implementerade köer kan hantera tusentals samtidiga användare och betjäna så högt som 1/2 miljon kö-/avköoperationer per minut. Fram till SQL Server 2005 var lösningen besvärlig och innebar en blandning av en SELECT
och en UPDATE
i en enda transaktion och ge precis rätt mix av låstips, som i artikeln länkad till gbn. Som tur är sedan SQL Server 2005 med tillkomsten av OUTPUT-satsen, finns en mycket mer elegant lösning tillgänglig, och nu rekommenderar MSDN att du använder OUTPUT-satsen:
Du kan använda OUTPUT i applikationer som använder tabeller som köer eller för att hålla mellanliggande resultatuppsättningar. Det vill säga att applikationen ständigt lägger till eller tar bort rader från tabellen
I grund och botten är det 3 delar av pusslet du behöver göra rätt för att detta ska fungera på ett mycket samtidigt sätt:
- Du måste avköa automatiskt. Du måste hitta raden, hoppa över alla låsta rader och markera den som "avköad" i en enda, atomär operation, och det är här
OUTPUT
klausul spelar in:
with CTE as (
SELECT TOP(1) COMMAND, PROCESSED
FROM TABLE WITH (READPAST)
WHERE PROCESSED = 0)
UPDATE CTE
SET PROCESSED = 1
OUTPUT INSERTED.*;
- Du måste strukturera din tabell med den klustrade indexnyckeln längst till vänster på
PROCESSED
kolumn. OmID
användes som en primärnyckel, flytta den sedan som den andra kolumnen i den klustrade nyckeln. Debatten om att behålla en icke-klustrad nyckel påID
kolumnen är öppen, men jag förordar inte starkt att ha några sekundära icke-klustrade index över köer:
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
- Du får inte fråga den här tabellen på något annat sätt än genom att köa. Försöker göra kikoperationer eller försöker använda tabellen både som en kö och eftersom en butik är mycket sannolikt leder till dödlägen och kommer att bromsa genomströmningen dramatiskt.
Kombinationen av atomic dequeue, READPAST-tips om att söka element att dequeue och tangenten längst till vänster på det klustrade indexet baserat på bearbetningsbiten säkerställer en mycket hög genomströmning under en mycket samtidig belastning.