почему оптимизатор запросов игнорирует индексированное представление

Есть запрос, который возвращает некоторую агрегацию по таблице заказов:

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 шт):

Автор решения: Aziz Umarov

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

→ Ссылка