En SQL Server 2008 tengo una visión V
sobre tablas A
y B
que se ve más o menos así¿cómo sabe SQL Server para bloquear objetos de vista?
create view V as
select * from A
union all
select * from B
lectura de V
hace que una consulta a tomar bloqueos compartidos de intención en las tablas base, sino que también tiene un bloqueo compartido de intención en el objeto de vista.
Está claro por qué necesitamos los bloqueos de IS en las tablas, y podemos ver que el bloqueo de IS en la vista impide la modificación simultánea de las tablas subyacentes a la vista. Esta bien.
El plan de consulta no contiene ninguna mención de la vista. Está completamente compilado, y el plan resultante en este caso es una concatenación simple de filas de las dos tablas base. De hecho, la única mención de la vista en el plan de consulta XML está en el texto de la declaración.
Si agrega una segunda vista U
sobre las tablas, la lectura de V
no causa ningún bloqueo en U
. Esto descarta que el motor solo tome un bloqueo IS en todas las vistas sobre A
y B
.
¿Cómo sabe el motor de la base de datos bloquear la vista?
- ¿El texto de la declaración se analiza de nuevo?
- ¿Hay algún otro canal de información entre el planificador de consultas y la ejecución subyacente para pasar esta información?
Véase el corresponding question on dba.stackexchange
para más detalles.
Presumiblemente, se inicia bloqueando la vista para evitar cambios en el diseño de la vista mientras se está utilizando. – JamieSee
@JamieSee, tomaría un bloqueo S od Sch-M, entonces. – usr
El plan de ejecución se almacena en un formato binario. No todo lo que contiene está representado en el XML que se nos muestra. –