2009-11-18 35 views
5

Tengo una consulta simple como esto¿Por qué esta instrucción SELECT se bloqueará en SQL Server?

SELECT * FROM MY_TABLE; 

Cuando lo ejecuto, cuelga SQL Server Management Studio.

Otras tablas y vistas funcionan bien.

¿Qué puede causar esto? He tenido bloqueos al ejecutar declaraciones UPDATE antes, y sé cómo acercarme a ellos. Pero, ¿qué podría hacer que un SELECT se bloquee?

He ejecutado el informe "Todas las transacciones de bloqueo" y dice que no hay ninguno.

Respuesta

10

Probablemente no es la selección que está bloqueando, pero algún otro proceso que se está editando (udpate/eliminar/insertar) la tabla que está causando los bloqueos.

Puede ver qué proceso está bloqueando al ejecutar exec sp_who2 en su servidor SQL.

alternativa, si estás bien con las lecturas sucias, puede hacer una de dos cosas

SELECT * FROM Table WITH (NOLOCK) 

O

SET Transaction Isolation Level Read Uncommitted 
SELECT * FROM Table 
+0

exec sp_who2 me dio un ÍNDICE ALTER que está en progreso. Parece ser el culpable. Gracias. – JosephStyons

3

Utilice esta:

SELECT * FROM MY_TABLE with (NOLOCK) 
+0

Eso funciona, pero ¿cómo puedo saber quién/qué está causando el bloqueo? – JosephStyons

+0

Ver la respuesta de BradC: Algún otro proceso tiene un bloqueo en la tabla, impidiendo que se realice su selección hasta que se libere el bloqueo – Mikhail

1

dos posibilidades:

  1. Es una mesa muy masiva , y está tratando de devolver 500m filas.
  2. Algún otro proceso tiene un bloqueo en la mesa, lo que impide que la seleccionen hasta que se suelte.
+0

No al # 1. Sí al # 2, pero ¿quién/qué? – JosephStyons

+0

@BradC en el n. ° 1 es 500 m, significa 500 millones, o es algo más. – robert

+0

@robert, sí quise decir 500 millones, o algún otro número absurdamente alto. – BradC

3

Si hay muchas otras actividades en curso, otra cosa podría estar causando bloqueos, y su SELECT podría ser la víctima del interbloqueo. si ejecuta la siguiente

SELECT * FROM my_table WITH(nolock) 

que estás diciendo la base de datos que está bien para leer los datos sucios (uncomitted), y que los bloqueos causados ​​por otra actividad puede ser ignorado con seguridad.

Además, si una consulta como la que causa el estudio de la gestión de colgar, su mesa podría utilizar un poco de optimización

1

MY_TABLE podría ser también encerrados por algunos transacción no confirmada - es decir, la escritura/procedimiento almacenado corriendo (o fallado en la ejecución) en otra ventana de MSMM.

Cuestiones relacionadas