Jeg anbefaler, at du gennemgår Brug af tabeller som køer. Korrekt implementerede køer kan håndtere tusindvis af samtidige brugere og servicere så højt som 1/2 million kø-/dekø-operationer i minuttet. Indtil SQL Server 2005 var løsningen besværlig og involverede en blanding af en SELECT
og en UPDATE
i en enkelt transaktion og give den helt rigtige blanding af låsehints, som i artiklen linket til af gbn. Heldigvis siden SQL Server 2005 med fremkomsten af OUTPUT-klausulen, er en meget mere elegant løsning tilgængelig, og nu anbefaler MSDN at bruge OUTPUT-klausulen:
Du kan bruge OUTPUT i applikationer, der bruger tabeller som køer eller til at holde mellemresultatsæt. Det vil sige, at applikationen konstant tilføjer eller fjerner rækker fra tabellen
Dybest set er der 3 dele af puslespillet, du skal gøre rigtigt, for at dette kan fungere på en meget samtidig måde:
- Du skal udlade køen automatisk. Du skal finde rækken, springe eventuelle låste rækker over og markere den som 'udsat' i en enkelt atomoperation, og det er her
OUTPUT
klausul kommer i spil:
with CTE as (
SELECT TOP(1) COMMAND, PROCESSED
FROM TABLE WITH (READPAST)
WHERE PROCESSED = 0)
UPDATE CTE
SET PROCESSED = 1
OUTPUT INSERTED.*;
- Du skal strukturer din tabel med den klyngede indeksnøgle længst til venstre på
PROCESSED
kolonne. HvisID
blev brugt som en primær nøgle, og flyt den derefter som den anden kolonne i den grupperede nøgle. Debatten om at beholde en ikke-klynget nøgle påID
kolonnen er åben, men jeg går stærkt ind for ikke at have sekundære ikke-klyngede indekser over køer:
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
- Du må ikke forespørge i denne tabel på andre måder end ved Dequeue. Prøver at udføre kig-operationer eller forsøger at bruge tabellen både som en kø og som en butik vil meget sandsynligt føre til dødvande og vil bremse gennemløbet dramatisk.
Kombinationen af atomic dequeue, READPAST hint om at søge elementer til at dequeue og nøglen længst til venstre på det clusterede indeks baseret på behandlingsbitten sikrer en meget høj gennemstrømning under en meget samtidig belastning.