В SQL Server 2008 у меня есть представление V
поверх таблиц A
и B
, которые выглядят примерно как
create view V as
select * from A
union all
select * from B
Чтение из V
приводит к тому, что запрос принимает блокированные общие блокировки в базовых таблицах, но также принимает намеренную общую блокировку для самого объекта представления.. p >
Понятно, почему нам нужны блокировки IS в таблицах, и мы видим, что блокировка IS в представлении предотвращает параллельную модификацию таблиц, лежащих в основе представления. Это прекрасно.
В плане запроса нет упоминания о представлении. Он полностью скомпилирован, и результирующий план в этом случае представляет собой простую конкатенацию строк из двух базовых таблиц. Действительно, единственное упоминание о представлении в XML-плане запроса содержится в тексте инструкции.
Если вы добавите второе представление U
по таблицам, чтение из V
не приведет к блокировке на U
. Это исключает, что движок просто берет блокировку IS во всех видах над A
и B
.
Как механизм базы данных знает, чтобы сделать блокировку в представлении?
- Повторяется ли текст инструкции?
- Есть ли какой-либо другой канал информации между планировщиком запросов и базовым исполнением, чтобы передать эту информацию?
Дополнительную информацию см. в соответствующем вопросе на dba.stackexchange
.