почему оптимизатор запросов игнорирует индексированное представление
Есть запрос, который возвращает некоторую агрегацию по таблице заказов:
SELECT
YEAR(InvoiceDate) AS InvoiceYear,
COUNT(InvoiceID) AS InvoiceCount
FROM Sales.Invoices
GROUP BY YEAR(InvoiceDate);
..и наблюдаю следующий план запроса:
я бы хотел избавиться от тяжелого оператора Hash Match с помощью индексированного представления
CREATE or alter VIEW Sales.vSalesByYear
WITH SCHEMABINDING
AS
SELECT
YEAR(InvoiceDate) AS InvoiceYear,
COUNT_BIG(*) AS InvoiceCount
FROM Sales.Invoices
GROUP BY YEAR(InvoiceDate);
GO
CREATE UNIQUE CLUSTERED INDEX idx_vSalesByYear
ON Sales.vSalesByYear (InvoiceYear);
GO
Почему при повторном выполнении запроса, план не меняется, и оптимизатор никак не хочет ссылаться на индексированное представление, ведь ему так легче будет?
Если напрямую обращаться к представлению, то план, который я хочу увидеть, появляется только после применения хинта (noexpand):
select
InvoiceYear
, InvoiceCount from Sales.vSalesByYear with (noexpand)
Ответы (1 шт):
Индексированное представление - это представление. Если вы его не используете, то и индекс тоже использоваться не будет. Если вы хотите чтоб в запросе к таблице использовался индекс, то индексируйте таблицу. А со временим набрав статистики оптимизатор сделает верное решение

