sql >> Database teknologi >  >> RDS >> Sqlserver

Brug af SQL Server som en DB-kø med flere klienter

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:

  1. 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.*;
  1. Du skal strukturer din tabel med den klyngede indeksnøgle længst til venstre på PROCESSED kolonne. Hvis ID 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);
  1. 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.



  1. SQL Server 2019 nye funktioner

  2. Udførelsesrækkefølge for betingelser i SQL 'where'-sætning

  3. Sådan skifter du database ved hjælp af PostgreSQL

  4. Hvad svarer til Oracles REF CURSOR i MySQL, når du bruger JDBC?