Понимание индексированного представления Обновление процесса запроса QND в SQL Server 2008 R2

StackOverflow https://stackoverflow.com/questions/4408258

Вопрос

Я создал проиндексированный вид (кластеризованный уникальный индекс на 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.
Так что вид состоит из двух столбцов:

Table1_ID
Table2TotalCount

T-SQL для создания просмотра является тяжелым из-за группового и нескольких миллионов строк в Table2.

Но когда я запускаю запрос к виду, как

Select Total2TotalCount from MyView where Table1_ID = k

- Он выполняется быстро и без накладных расходов для сервера.

Также в T-SQL для создания просмотра многих условий в том случае, если Table2 столбцы. И если я изменил TALLE2_DELETEDMARM к 1 и запустить запрос

Select Total2TotalCount from MyView where Table1_ID = k

Опять же - я получу правильные результаты. (Table2TotalCount уменьшился на 1).

Поэтому наши вопросы:
1. Почему время выполнения запросов так много уменьшилось, когда мы использовали проиндексированные представления (сравните без просмотра, используя (даже мы запустим DBCC DROPCLEANBUFFERS() перед выполнением запроса для просмотра))
2. После смены

Table2_DeletedMark 

Просмотр немедленно пересчитан, и мы получаем правильные результаты, но каков процесс? Мы не можем себе представить, что SQL выполняет T-SQL по какому представлением каждый раз, когда мы изменяем все значения более 10 столбцов, содержащих в генерации T-SQL, потому что он слишком тяжелый.
Мы понимаем, что достаточно запустить простой запрос для пересчета значений, зависит от значений столбцов, которые мы меняем.
Но как SQL это понимает?

Это было полезно?

Решение

Проиндексированный вид материализовано например, его строки, которые он содержит (из таблиц, это зависит от) физически хранится На диске - очень похоже на таблицу «System-Completed», которая всегда поддерживается в курсе всякий раз, когда его базовые таблицы меняются. Это сделано путем добавления кластерного индекса - страницы листа кластерного индекса на таблице SQL Server (или просмотра) являются Страницы данных действительно.

Столбцы в проиндексированном представлении также могут быть проиндексированы с не кластеризованными индексами, и, таким образом, вы можете еще больше улучшить производительность запроса. Вниз сторона: поскольку строки хранятся, вам нужно дисковое пространство (и некоторые данные дублированы, очевидно, очевидно).

Нормальный вид, с другой стороны, это просто фрагмент SQL, который будет выполнен для вычисления результатов - на основе того, что вы выбираете с этого представления. Там нет физического представления этого мнения, нет никаких строк, хранящихся на регулярном представлении - им необходимо объединить из базовых таблиц по мере необходимости.

Другие советы

Как вы думаете, почему есть так много странных правил о том, что разрешено в проиндексированных представлениях, и что разрешено делать базовые таблицы? Это так, что двигатель SQL может немедленно знать «Если я прикасаюсь к этой строке, это потенциально влияет на результат этого представления - давайте посмотрим, эта строка больше не соответствует критериям просмотра, но я настаивал на том, чтобы иметь COUNT_BIG (*), так что я могу просто уменьшить эту ценность одним "

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top