Индексированные представления SQL Server, используемые вместо таблиц

Я немного запутался в использовании индексированных представлений в SQL Server 2016.

Вот моя проблема. Если у меня есть таблица фактов с большим количеством столбцов, и я создаю индексированное представление с именем IV_Sales как

select 
    year, 
    customer, 
    sum(sales) 
from F_Sales 
group by year, customer

Я бы объединил все продажи за год и клиента.

После этого, когда пользователь запускает запрос из F_sales лайк

Select 
    year, customer, 
    sum(sales) 
from F_sales 
group by year, customer 

будет ли оптимизатор (в SQL Server Enterprise Edition) автоматически использовать индексированное представление IV_sales вместо сканирования таблицы F_sales? У меня есть Standard Edition, и когда я добавляю

Select 
    year, 
    customer, 
    sum(sales) 
from F_sales WITH (NOEXPAND) 
group by year, customer

Я получаю сообщение об ошибке, поскольку нет кластеризованного индекса, подобного тому, который я создал в индексированном представлении. Есть ли способ принудительно использовать индексные представления вместо таблицы в Standard Edition?

Моя реальная проблема в том, что у меня есть модель Cognos Framework, указывающая на таблицу F_sales и когда отчет выполняется с использованием года, клиента и суммы продаж по причинам производительности, я хочу, чтобы он автоматически использовал индексированное представление вместо таблицы.

Я надеюсь, что я проясняю свою проблему. Спасибо заранее.

1 ответ

Если у вас есть проблемы с производительностью, индексированные представления, вероятно, последнее, что вы хотите попробовать.

Вы должны исчерпать все другие возможности, например, стандартные индексы.

Например, если вы точно знаете, что выполняете сканирование таблицы, простое решение состоит в добавлении некластеризованного индекса для удовлетворения запроса, чтобы вместо этого он выполнял сканирование или поиск индекса. Если он по-прежнему не использует это, вам нужно продолжить настройку производительности и выяснить, почему это не так (не выраженные в выражениях? Устаревшая статистика?)

Ваше индексированное представление будет автоматически использоваться (без явного упоминания об индексированном представлении) в очень ограниченном числе случаев. Вы увидите это в плане запроса.

Если ваш запрос очень близко соответствует определению представления индекса, он будет использовать ваше представление с индексами.

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

Инструменты автоматической записи SQL, такие как Cognos, очень быстро сделают SQL неузнаваемым для планировщика запросов и, следовательно, не будут использовать индексированное представление.

Все это очень легко проверить, если вы просто взломаете SSMS и проведете несколько экспериментов.

Итак, вкратце: начните с стандартных индексов, отфильтрованных индексов, даже индексов хранилищ столбцов (которые особенно хороши для таблиц фактов или, как я слышал)

Другие вопросы по тегам