Estamos tratando de tener una tabla transaccional que solo tome nuevos registros insertados regularmente.¿Por qué SQL Server 2008 bloquea los SELECT en transacciones largas INSERT?
Esta tabla simple requiere que agreguemos continuamente nuevos registros a lo largo del tiempo. Se espera que el volumen de transacciones en esta tabla sea bastante alto, y también puede haber importaciones periódicas por lotes de transacciones (> 1000) que pueden tardar varios segundos en completarse.
A partir de estos datos, a continuación, hacemos un conjunto de declaraciones de selección que agrupan columnas diferentes para devolver los valores requeridos.
A partir de nuestras pruebas iniciales, hemos encontrado un cuello de botella relacionado con SQL Server que bloquea nuestro SELECT cuando se encuentra en medio de una transacción de INSERTS.
A continuación se muestra un ejemplo simple que se puede ejecutar para ilustrar el problema.
- Simple DB Tabla
create table LOCK_TEST (
LOCK_TEST_ID int identity ,
AMOUNT int);
- Ejecutar esta consulta en la ventana 1
begin tran
insert into LOCK_TEST (AMOUNT) values (1);
WAITFOR DELAY '00:00:15' ---- 15 Second Delay
insert into LOCK_TEST (AMOUNT) values (1);
commit
- En la Consulta 2 plazo esto en paralelo
select SUM(AMOUNT)
from LOCK_TEST;
Yo esperaría Consulta 2 para volver inmediatamente, con 0 hasta que se complete la consulta 1, y luego mostrar 2. Nunca queremos ver 1 como resultado de la segunda consulta.
Las respuestas que hemos analizado se relacionan con WITH (NOLOCK) en la instrucción select. Pero esto infringe los límites transaccionales, y la información devuelta puede ser de naturaleza financiera y no deseamos ver ningún detalle sin compromiso en nuestras consultas.
Mi problema parece estar en el lado INSERT ...
¿Por qué bloquean el INSERT la instrucción SELECT a pesar de que no es la modificación de los datos existentes?
Pregunta de puntos extra: ¿Es esta una "característica" de SQL Server, o la encontraríamos en otros sabores de bases de datos también?
ACTUALIZACIÓN Ahora he tenido tiempo de encontrar una base de datos local de Oracle y ejecutar la misma prueba simple. Este pase de prueba es como esperaba.
Es decir, que se puede ejecutar la consulta con la frecuencia que yo quiero, y volverá nula hasta que la primera transacción se confirma, entonces vuelve 2.
¿Hay una manera de hacer el trabajo de SQL Server como este? o ¿tenemos que movernos a Oracle?
¿Qué índices tiene en estas tablas? ¿tiene mantenimiento de índice regular? –
No hay índices en este momento. Vea el ejemplo simple enumerado en esta publicación, nada más que la simple tabla de 2 columnas, inserción básica y selección se utilizan para volver a crear este problema. – stevemac