Препоръчвам ви да разгледате Използването на таблици като опашки. Правилно внедрените опашки могат да се справят с хиляди едновременни потребители и да обслужват до 1/2 милион операции за опашка/изключване на опашка в минута. До SQL Server 2005 решението беше тромаво и включваше смесване на SELECT
и UPDATE
в една транзакция и дайте точния микс от съвети за заключване, както е в статията, свързана от gbn. За щастие след SQL Server 2005 с появата на клаузата OUTPUT е налично много по-елегантно решение и сега MSDN препоръчва използването на клаузата OUTPUT:
Можете да използвате OUTPUT в приложения, които използват таблици като опашки или за задържане на междинни набори от резултати. Това означава, че приложението постоянно добавя или премахва редове от таблицата
По принцип има 3 части от пъзела, които трябва да оправите, за да може това да работи по много едновременен начин:
- Трябва да извадите от опашката автоматично. Трябва да намерите реда, да пропуснете всички заключени редове и да го маркирате като „изключен от опашката“ в единична атомна операция и това е мястото, където
OUTPUT
клауза влиза в игра:
with CTE as (
SELECT TOP(1) COMMAND, PROCESSED
FROM TABLE WITH (READPAST)
WHERE PROCESSED = 0)
UPDATE CTE
SET PROCESSED = 1
OUTPUT INSERTED.*;
- Вие трябва структурирайте таблицата си с най-левия клъстериран индексен ключ в
PROCESSED
колона. АкоID
беше използван първичен ключ, след което го преместете като втора колона в клъстерирания ключ. Дебатът дали да се запази неклъстериран ключ вID
колоната е отворена, но аз силно подкрепям не с всякакви вторични неклъстерирани индекси върху опашки:
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
- Не трябва да правите заявка към тази таблица по друг начин, освен чрез Dequeue. Опит за извършване на операции Peek или опит за използване на таблицата и като опашка и тъй като магазин много вероятно води до блокиране и ще забави драстично пропускателната способност.
Комбинацията от атомно изключване, READPAST намек за търсене на елементи за изключване и най-ляв ключ в клъстерирания индекс въз основа на бит за обработка осигуряват много висока пропускателна способност при силно едновременно натоварване.