как SQL Server узнает, что нужно заблокировать объекты представления?

В SQL Server 2008 у меня есть представление Vпо таблицам Aи B, которое выглядит примерно так

create view V as
    select * from A
    union all
    select * from B

Чтение из Vприводит к тому, что запрос принимает общие блокировки намерений на базе. table , но также использует совместную блокировку намерения для самого объекта представления .

Понятно, почему нам нужны IS-блокировки для таблиц, и мы видим, что IS-блокировка для представления предотвращает одновременную модификацию таблиц, лежащих в основе представления. Это нормально.

План запроса не содержит упоминания о представлении. Он полностью скомпилирован, и результирующий план в данном случае представляет собой простое объединение строк из двух базовых таблиц. Действительно, единственное упоминание о представлении в XML-плане запроса находится в тексте инструкции.

Если вы добавите второе представление Uнад таблицами, чтение из Vне приведет к блокировке U. Это исключает то, что движок просто блокирует IS для всех представлений по Aи B.

Как ядро ​​базы данных узнает, что нужно заблокировать представление?

  • Производится ли повторный синтаксический анализ текста оператора?
  • Существует ли какой-либо другой канал передачи информации между планировщиком запросов и базовым исполнением для передачи этой информации?

Подробности см. в соответствующем вопросе по dba.stackexchange.

12
задан Community 13 April 2017 в 12:42
поделиться