2010-12-13 91 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