sql >> Database >  >> RDS >> Sqlserver

SQL Server gebruiken als een DB-wachtrij met meerdere clients

Ik raad je aan om Tabellen als wachtrijen te gebruiken. Goed geïmplementeerde wachtrijen kunnen duizenden gelijktijdige gebruikers aan en bieden service tot 1/2 miljoen wachtrijen/dequeue-bewerkingen per minuut. Tot SQL Server 2005 was de oplossing omslachtig en omvatte het mixen van een SELECT en een UPDATE in een enkele transactie en geef precies de juiste mix van slothints, zoals in het artikel dat is gelinkt door gbn. Gelukkig is er sinds SQL Server 2005 met de komst van de OUTPUT-clausule een veel elegantere oplossing beschikbaar, en nu raadt MSDN het gebruik van de OUTPUT-clausule aan:

U kunt OUTPUT gebruiken in toepassingen die tabellen als wachtrijen gebruiken of om tussentijdse resultatensets te bewaren. Dat wil zeggen, de applicatie is constant bezig met het toevoegen of verwijderen van rijen uit de tabel

In principe zijn er 3 delen van de puzzel die je goed moet krijgen om dit op een zeer gelijktijdige manier te laten werken:

  1. Je moet automatisch uit de wachtrij halen. Je moet de rij vinden, alle vergrendelde rijen overslaan en deze markeren als 'uit de wachtrij gehaald' in een enkele atomaire bewerking, en dit is waar de OUTPUT clausule komt in het spel:
    with CTE as (
      SELECT TOP(1) COMMAND, PROCESSED
      FROM TABLE WITH (READPAST)
      WHERE PROCESSED = 0)
    UPDATE CTE
      SET PROCESSED = 1
      OUTPUT INSERTED.*;
  1. Je moet structureer uw tabel met de meest linkse geclusterde indexsleutel op de PROCESSED kolom. Als de ID een primaire sleutel is gebruikt, verplaats deze vervolgens als de tweede kolom in de geclusterde sleutel. Het debat over het al dan niet behouden van een niet-geclusterde sleutel op de ID kolom is open, maar ik ben sterk voorstander van niet met secundaire niet-geclusterde indexen over wachtrijen:
    CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
  1. U mag deze tabel niet op een andere manier opvragen dan met Dequeue. Proberen Peek-bewerkingen uit te voeren of de tabel zowel als een wachtrij en . proberen te gebruiken zoals een winkel zeer waarschijnlijk leiden tot impasses en zal de doorvoer drastisch vertragen.

De combinatie van atomaire dequeue, READPAST-hint op zoekelementen om uit de wachtrij te halen en meest linkse sleutel op de geclusterde index op basis van de verwerkingsbit zorgen voor een zeer hoge doorvoer bij een zeer gelijktijdige belasting.



  1. Aan de slag met PostgreSQL 11 op Ubuntu 18.04

  2. Hoe het aantal minuten naar het uu:mm-formaat in TSQL te converteren?

  3. CAST()-functie in Oracle

  4. Room - Gebruik van externe SQLites en interne DB