Base de datos transaccional utilizada para reservar cosas ...
Se le pidió a nuestro proveedor que reemplazara #temptables por @tablevariables (debido a los bloqueos de compilación pesados), pero en su lugar lo reemplazaron con una tabla real que agrega SPID como una columna para garantizar que el procedimiento almacenado solo actúe en las filas correspondientes.
¿Ves algún riesgo en este método de operación? Antes de que todas las transacciones se aislaran dentro de su propia transacción ... Me preocupaba que pudiéramos terminar bloqueando esta tabla un montón, pero su opinión es que SQL usa el bloqueo a nivel de fila y esto no creará más bloqueos.
Versión de SQL Server: 2016 Enterprise - 13.0.5216.0
CREATE TABLE dbo.qryTransactions (
ID int IDENTITY (0,1) NOT NULL CONSTRAINT pk_qryTransactions PRIMARY KEY CLUSTERED,
spid int NOT NULL,
OrderID int,
ItemID int,
TimeTransactionStart datetime,
TimeTransactionEnd datetime,
...other fields
)
CREATE INDEX idx_qryTransactions_spidID ON qryTransactions (spid, ID) INCLUDE (ItemID, OrderID, TimeTransactionStart, TimeTransactionEnd)
Respuestas:
Un poco más de divagación de lo que cabe en un bloque de comentarios ... y quiero resaltar un comentario que hizo el OP en respuesta a la respuesta de Ray:
Saliendo en una ligera tangente por un minuto ... sobre lo que sucedería con este escenario es Sybase ASE ...
Volver a la edición del OP (bloqueos de compilación en el proceso hijo) ...
En cuanto a la idea de usar una sola tabla permanente con @@ SPID para diferenciar filas entre sesiones ... estado allí, visto que ... qué asco ; problemas recurrentes:
Me gustaría volver y (re) investigar el problema raíz (bloqueos de compilación en el proceso secundario) y ver si hay una manera de reducir (¿eliminar?) Dichos bloqueos de compilación. [Lamentablemente, mi conocimiento de SQL Server sobre estos temas es ... NULO ... por lo que estaría interesado en la información de algunos expertos en compiladores de SQL Server.]
fuente
Me parece que usar algo
@@SPID
así es pedir problemas.Las ID de sesión se reutilizan con frecuencia; tan pronto como una conexión de usuario cierre sesión, esa ID de sesión estará disponible para ser utilizada nuevamente, y es probable que la próxima sesión que intente conectarse la use.
Para que funcione al menos de forma semi confiable, necesitaría un desencadenador de inicio de sesión que purgue las filas anteriores de la tabla con el mismo
@@SPID
. Si haces eso, es probable que veas muchos bloqueos en la tabla usando la@@SPID
columna.SQL Server sí usa el bloqueo de filas, pero también usa el bloqueo de páginas y el bloqueo de tablas. Por supuesto, es posible que pueda mitigar eso mediante una buena indexación, pero esto todavía me parece un antipatrón.
Si el procedimiento almacenado es el único método utilizado para acceder a las tablas afectadas, puede investigar el uso de un bloqueo de la aplicación,
sp_getapplock
esencialmente para serializar el acceso a las partes relevantes. Los documentos para sp_getapplock están aquí . Erik Darling tiene una publicación interesante al respecto aquí .fuente
Sí, veo riesgos. Es ingenuo contar con SQL utilizando el bloqueo de filas. Por ejemplo, estoy bastante seguro de que las inserciones y eliminaciones usarán bloqueos de página al menos. SQL Engine elige el tipo de bloqueo en función de varios factores y ninguno de esos factores incluye "su opinión". Las soluciones generales, como cambiar las tablas temporales a variables de tabla, generalmente también son malas ideas. Las variables de tabla son muy útiles en algunas situaciones, pero tienen limitaciones y problemas de rendimiento. Prefiero tablas temporales en la mayoría de las circunstancias. Particularmente cuando la mesa tendrá más de unas pocas docenas de filas. Solicitaría al proveedor que explique por qué el sistema experimentó "bloqueos de compilación pesados" y cómo eso degradó el rendimiento. Recuerde, cada vez que mire encontrará "cerraduras pesadas" de algún tipo. Eso no significa necesariamente que las cerraduras sean un problema. Max ' Los comentarios sobre @@ SPID también son importantes. Además, el modelo de transacción y el procesamiento de errores podrían ser grandes problemas. Si su sistema experimenta puntos muertos o problemas de calidad de los datos de entrada, entonces el procesamiento de error estándar puede dar lugar a la finalización de la sesión sin que la tabla qryTransactions se restablezca correctamente. En mi opinión, el enfoque de solución incorrecta para el problema original.
fuente