sql >> Base de Datos >  >> RDS >> Sqlserver

Uso de SQL Server como cola de base de datos con varios clientes

Le recomiendo que repase Uso de tablas como colas. Las colas implementadas correctamente pueden manejar miles de usuarios simultáneos y el servicio puede alcanzar hasta 1/2 millón de operaciones de puesta en cola/eliminación de cola por minuto. Hasta SQL Server 2005, la solución era engorrosa e implicaba mezclar un SELECT y una UPDATE en una sola transacción y brinde la combinación correcta de sugerencias de bloqueo, como en el artículo vinculado por gbn. Afortunadamente, desde SQL Server 2005 con la llegada de la cláusula OUTPUT, hay disponible una solución mucho más elegante, y ahora MSDN recomienda usar la cláusula OUTPUT:

Puede usar OUTPUT en aplicaciones que usan tablas como colas o para contener conjuntos de resultados intermedios. Es decir, la aplicación está constantemente agregando o eliminando filas de la tabla

Básicamente, hay 3 partes del rompecabezas que debes resolver correctamente para que esto funcione de manera altamente concurrente:

  1. Debe eliminar la cola automáticamente. Tiene que encontrar la fila, omitir las filas bloqueadas y marcarla como 'retirada de la cola' en una única operación atómica, y aquí es donde la OUTPUT entra en juego la cláusula:
    with CTE as (
      SELECT TOP(1) COMMAND, PROCESSED
      FROM TABLE WITH (READPAST)
      WHERE PROCESSED = 0)
    UPDATE CTE
      SET PROCESSED = 1
      OUTPUT INSERTED.*;
  1. Usted debe estructura tu tabla con la clave de índice agrupado más a la izquierda en PROCESSED columna. Si el ID se usó una clave principal, luego muévala como la segunda columna en la clave agrupada. El debate sobre si mantener una clave no agrupada en el ID la columna está abierta, pero estoy totalmente a favor de no tener índices secundarios no agrupados sobre colas:
    CREATE CLUSTERED INDEX cdxTable on TABLE(PROCESSED, ID);
  1. No debe consultar esta tabla por ningún otro medio que no sea Dequeue. Tratando de hacer operaciones Peek o tratando de usar la tabla como una Cola y como una tienda muy probablemente provocará interbloqueos y ralentizará drásticamente el rendimiento.

La combinación de eliminación de cola atómica, sugerencia de READPAST en la búsqueda de elementos para eliminar la cola y la tecla más a la izquierda en el índice agrupado basado en el bit de procesamiento garantiza un rendimiento muy alto bajo una carga altamente concurrente.