Я создал индексированное представление (кластеризованный уникальный индекс на Table1_ID
) с таким T-SQL:
Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where Table2_DeletedMark=0 AND ... Group BY Table1_ID
Также после создания представления мы устанавливаем кластеризованный уникальный индекс для столбца Table1_ID.
Итак, View состоит из двух столбцов:
Table1_ID
Table2TotalCount
T-Sql для создания View является тяжелым из-за группирования по нескольким миллионам строк в Table2.
Но когда я запускаю запрос к представлению, подобному
Select Total2TotalCount from MyView where Table1_ID = k
- выполняется быстро и без нагрузки на сервер.
Также в t-sql для создания представления много условий в предложении where для Table2
столбцов. А также
Если я изменил Table2_DeletedMark на 1 и запустил запрос
Select Total2TotalCount from MyView where Table1_ID = k
снова - я получу правильные результаты. (Table2TotalCount
уменьшилось на 1).
Итак, наши вопросы:
1. Почему время выполнения запроса так сильно уменьшилось, когда мы использовали индексированное представление (сравните с использованием без представления (даже мы запускаем DBCC DROPCLEANBUFFERS()
перед выполнением запроса к VIEW))
2. После изменения
Table2_DeletedMark
Просмотр сразу пересчитывается и мы получаем правильные результаты, но каков процесс позади? мы не можем представить, что sql выполняет t-sql в зависимости от того, какое представление генерировалось каждый раз, когда мы изменяем любые значения более 10 столбцов, содержащихся в генерации представления t-sql, потому что оно слишком тяжелое.
Мы понимаем, что достаточно выполнить простой запрос для пересчета значений, в зависимости от значений столбцов, которые мы меняем.
Но как sql это понимает?