Сопоставление индексированных представлений SQL Server с неработающими соединениями

Есть ли у кого-нибудь опыт, когда SQL Server 2008 R2 может автоматически сопоставлять индексированное представление (также известное как материализованное представление), содержащее соединения с запросом?

Например, вид

select dbo.Orders.Date, dbo.OrderDetails.ProductID
from dbo.OrderDetails
join dbo.Orders on dbo.OrderDetails.OrderID = dbo.Orders.ID

Не может автоматически сопоставляться с точно таким же запросом. Когда я выбираю прямо из этого представления with (noexpand), я фактически получаю гораздо более быстрый план запроса, который выполняет сканирование кластеризованного индекса индексированного представления. Могу ли я заставить SQL Server выполнять это сопоставление автоматически? У меня довольно много запросов и представлений, и я не хочу каждый раз вручную ссылаться на индексированное представление, потому что я использую ИЛИ-сопоставитель.

Я использую корпоративную версию SQL Server 2008 R2.

Изменить: я нашел решение. SQL Server 2008 R2 не сопоставляет индексированные представления с более чем двумя соединениями автоматически. Вероятно, это слишком сильно замедлит процесс оптимизации.

Редактировать 2: просматривая это через 2 года после того, как я создал вопрос, я не думаю, что мой вывод был правильным. Сопоставление материализованных представлений — очень хрупкий процесс, для которого нет четких правил, которые я мог найти за годы.

Безусловно, играют роль:

  • Количество соединений
  • Наличие предиката
  • Порядок соединения как в представлении, так и в запросе



Ответы (1)


Я немного не понимаю, в чем именно заключается ваш вопрос; но я думаю, что это даст вам то, что вы хотите:

http://msdn.microsoft.com/en-us/library/ms181151.aspx

Существует множество странных, кажущихся произвольными условий, которые ограничивают использование SQL Server индекса представления в запросе. На этой странице они описаны для SQL Server 2008.

person RMorrisey    schedule 22.05.2010