SQL Server 2008 R2 и план выполнения в индексированном представлении - PullRequest
2 голосов
/ 13 декабря 2010

Я создал индексированное представление ( MyView ), которое состоит из трех столбцов:

Table1_ID (int not null)
Object_CreationDate (datetime, null)
Objec_Count(bigint null)

Я создал кластеризованный уникальный индекс IX_1 по двум столбцам: Table1_ID И Object_CreationDate

Я хочу выполнить два запроса:
1.

Select * from [dbo].MyView
where Table1_ID = 10

2

 Select * from [dbo].MyView
where Table1_ID = 10
AND Object_CreationDate <= GETDATE()

1-й запрос выполняется быстро (даже с DBCC DROPCLEANBUFFERS () ) и использует простой план выполнения с использованием MyView и IX_1
Второй запрос выполняется не так быстро, потому что он использует «старый» план выполнения (поиск по нескольким индексам в трех таблицах и вложенный цикл)

Я неправильно понимаю эту ситуацию. Как по мне, естественно использовать IX_1 и MyView для 2-го запроса.
Более того, я жду, что 2-й запрос выполняется с той же скоростью или даже быстрее, чем 1-й, потому что он использует два столбца в условии where , которые находятся в кластерном индексе.

Я попытался запустить 2-й запрос with(index=IX_1) и обновить статистику для столбцов, но все еще с тем же планом выполнения.

Можно ли принудительно использовать sql MyView И IX_1 ?

1 Ответ

6 голосов
/ 13 декабря 2010

Если вы не используете Enterprise / Developer Edition, вам нужно включить подсказку WITH NOEXPAND

 Select * from [dbo].MyView WITH (NOEXPAND)
where Table1_ID = 10
AND Object_CreationDate <= GETDATE()

Из Разработка индексированных представлений :

Индексированные представления могут быть созданы в любой редакции SQL Server 2008. В SQL Server 2008 Enterprise оптимизатор запросов автоматически рассматривает индексированное представление. Чтобы использовать индексированное представление во всех других выпусках, необходимо использовать табличную подсказку NOEXPAND.

(А Developer Edition в основном Enterprise Edition, с другой лицензией)

...