SQL Server Select Count READ_COMMITTED_SNAPSHOT PREGUNTA

8

Parece que estoy obteniendo muchos puntos muertos cuando hago select count (*) en una tabla en particular. Ya he cambiado todos los parámetros requeridos y los he bloqueado solo en la fila.

También he cambiado la base de datos para usar el aislamiento READ_COMMITTED_SNAPSHOT,

sin embargo, parece que usando un recuento selectivo (*) donde column =? en la mesa desencadena puntos muertos o bloqueos en la mesa ..

¿Estoy en lo cierto al decir que el recuento selectivo (*) solo debería estar accediendo a filas intermedias ?, sin embargo, no parece ser así y todavía me encuentro con puntos muertos. La indexación adecuada probablemente ayudaría,

La pregunta es: ¿SQL Server 2008 R2 coloca el bloqueo compartido en la tabla durante el recuento de selección (*) incluso cuando read_committed_snapshot está activado?

Gracias

grassbl8d
fuente
¿Necesita un recuento exacto (a partir de la solicitud) o un recuento aproximado está bien?
Jon Seigel
en realidad, solo necesito saber si se están colocando bloqueos compartidos. Estoy tratando de investigar un problema de punto muerto. Gracias
grassbl8d
Mi punto fue que si puede considerar cambiar la forma en que se obtiene el recuento, esa puede ser la forma de resolver el problema de punto muerto. Pero ahora que leí la pregunta nuevamente, si necesita usar una WHEREcláusula, el método en el que estoy pensando no funcionará de todos modos.
Jon Seigel
Puede obtener recuentos aproximados de las tablas de metadatos para un subconjunto de la tabla si la cláusula where coincide con un índice filtrado.
Aaron Bertrand

Respuestas:

2

Tenga cuidado con READ_COMMITTED_SNAPSHOT: si lo configura, puede causar muchos errores sutiles.

También READ_COMMITTED_SNAPSHOT es el nivel de aislamiento predeterminado, que puede ser anulado por algo. Ejecute DBCC USEROPTIONS para determinar el nivel de aislamiento real con el que se ejecuta su selección.

Establecería explícitamente el NIVEL DE AISLAMIENTO DE TRANSACCIÓN INSTANTÁNEO justo antes de su selección. De esa manera, se asegurará de que su selección nunca se incluya en puntos muertos, y no rompa ningún otro código, como READ_COMMITTED_SNAPSHOT.

Alaska
fuente
0

El bloqueo con Snapshot Isolation no cambia. Lo que cambia es que cuando las páginas se cambian debajo de usted, esas páginas se copian en la base de datos tempdb para que pueda leerlas desde la base de datos tempdb en lugar de desde la base de datos normal. (Sí, esta es una versión simplificada de lo que está sucediendo).

Mencionó que no tiene una indexación adecuada, por lo que está haciendo un escaneo de índice agrupado (o un escaneo de tabla si es un montón). Esa es potencialmente una gran cantidad de datos que se moverán a la base de datos tempdb. Si esta consulta es algo que se ejecutará más de una vez, sugeriría agregar el índice a la tabla.

¿Qué nivel de aislamiento está usando su consulta?

mrdenny
fuente
Estoy usando el nivel de aislamiento read_commited_snapshot. Lo encendí porque estoy usando read_committed por defecto. Solo me interesa si se colocan bloqueos durante los recuentos seleccionados. Gracias, ya he colocado índices por cierto
grassbl8d
Sí, todavía se están tomando cerraduras. Puede consultar sys.dm_tran_locks para ver los bloqueos que se están tomando. Ejecute su consulta en una ventana y consulte sys.dm_tran_locks en otra ventana para ver qué bloqueos se están tomando. Es posible que esté aumentando a bloqueos de tabla y necesite usar una pista para forzar bloqueos de página o incluso de nivel de fila.
mrdenny