Polecam przejrzeć Korzystanie z tabel jako kolejek. Właściwie zaimplementowane kolejki mogą obsłużyć tysiące jednoczesnych użytkowników i usługi nawet do 1/2 miliona operacji wpisywania/usuwania z kolejki na minutę. Do SQL Server 2005 rozwiązanie było kłopotliwe i wymagało mieszania SELECT
i UPDATE
w jednej transakcji i podaj odpowiednią mieszankę wskazówek dotyczących blokad, jak w artykule połączonym przez gbn. Na szczęście od czasu SQL Server 2005 z pojawieniem się klauzuli OUTPUT, dostępne jest znacznie bardziej eleganckie rozwiązanie, a teraz MSDN zaleca używanie klauzuli OUTPUT:
Funkcji OUTPUT można używać w aplikacjach, które używają tabel jako kolejek lub do przechowywania pośrednich zestawów wyników. Oznacza to, że aplikacja stale dodaje lub usuwa wiersze z tabeli
Zasadniczo są 3 części układanki, które musisz ułożyć dobrze, aby działało to w sposób wysoce współbieżny:
- Musisz automatycznie usunąć kolejkę. Musisz znaleźć wiersz, pominąć wszystkie zablokowane wiersze i oznaczyć go jako „wycofany z kolejki” w pojedynczej, niepodzielnej operacji, a to jest miejsce, w którym
OUTPUT
w grę wchodzi klauzula:
with CTE as (
SELECT TOP(1) COMMAND, PROCESSED
FROM TABLE WITH (READPAST)
WHERE PROCESSED = 0)
UPDATE CTE
SET PROCESSED = 1
OUTPUT INSERTED.*;
- Trze musisz ustrukturyzuj swoją tabelę za pomocą klucza indeksu klastrowego znajdującego się najbardziej po lewej stronie w
PROCESSED
kolumna. JeśliID
został użyty jako klucz podstawowy, a następnie przenieś go jako drugą kolumnę w kluczu klastrowym. Debata, czy zachować klucz nieklastrowany wID
kolumna jest otwarta, ale zdecydowanie popieram nie posiadanie jakichkolwiek drugorzędnych indeksów nieklastrowanych w kolejkach:
CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
- Nie możesz wysyłać zapytań do tej tabeli w inny sposób niż przez usunięcie z kolejki. Próba wykonania operacji Peek lub próba użycia tabeli zarówno jako kolejki i jako sklep bardzo prawdopodobne doprowadzi do impasu i drastycznie spowolni przepustowość.
Kombinacja atomowego usunięcia z kolejki, wskazówki READPAST przy wyszukiwaniu elementów do usunięcia z kolejki i najbardziej lewego klucza w indeksie klastrowym w oparciu o bit przetwarzania zapewnia bardzo wysoką przepustowość przy wysoce równoczesnym obciążeniu.