sql >> Databasteknik >  >> RDS >> Sqlserver

Använder SQL Server som en DB-kö med flera klienter

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:

  1. 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.*;
  1. Du måste strukturera din tabell med den klustrade indexnyckeln längst till vänster på PROCESSED kolumn. Om ID 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);
  1. 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.



  1. Hur får man sista dagen i förra veckan i sql?

  2. PDO med INSERT INTO genom upprättade utlåtanden

  3. Grunderna i SQL Server Task Automation

  4. Hur testar man om en sträng är JSON eller inte?