2010-12-13 89 views
2

我創建了一個索引視圖(MyView的)是由三列組成:SQL Server 2008 R2和執行計劃中的索引視圖

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

我創建聚集唯一索引 IX_1兩個列:Table1_IDObject_CreationDate

我想運行兩個查詢:
1.

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

2.

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

1-ST查詢運行快(即使DBCC DROPCLEANBUFFERS()),並通過使用MyView的和IX_1使用簡單的執行計劃
2-ND查詢運行沒有這麼快,因爲它使用「舊」執行計劃(通過三個表中的多個索引搜索和嵌套循環)

我誤解了這種情況。至於我,這是自然使用IX_1和MyView爲第2查詢。
此外,我等待第2個查詢以相同的速度運行,甚至比第1個更快,因爲它在聚簇索引中的where子句中使用兩列

我試着運行第二個查詢with(index=IX_1)並更新列的統計信息,但仍然有相同的執行計劃。

是否有可能強制使用sql MyView AND IX_1

回答

6

除非你使用的企業版/開發版,您需要包括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表格提示。

(和開發人員版基本上是企業版,用不同的牌)

+1

我驚訝,你知道管理工作室的這種特性。 – 2010-12-13 10:52:09