2010-12-13 3 views
2

Я создал индексированное представление (MyView), который состоит из трех колонок:SQL 2008 в индексированном представлении

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
2-й запрос выполняется не так быстро, потому что он использует «старый» план выполнения (поиск по нескольким индексам в трех таблицах и вложенному циклу)

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

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

Можно ли заставить использовать SQL MyView И IX_1?

ответ

6

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

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

От Designing Indexed Views:

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

(И издание Разработчика в основном Enterprise Edition, с различным лицензированием)

+1

Я поражен вы знаете такие свойства студии управления. –

Смежные вопросы