2

我创建了一个包含三列的索引视图 ( 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()

第一次查询运行速度很快(即使使用DBCC DROPCLEANBUFFERS())并通过使用 MyView 和 IX_1 使用简单的执行计划
第二次查询运行速度不是那么快,因为它使用“旧”执行计划(通过三个表中的多个索引查找并嵌套循环)

我误解了这种情况。至于我,很自然地使用 IX_1 和MyView进行第二次查询。
此外,我等待第二次查询的运行速度与第一次查询相同甚至更快,因为它在聚集索引中的 where 子句中使用了两列。

我尝试运行第二次查询with(index=IX_1)并更新列的统计信息,但仍然具有相同的执行计划。

是否可以强制 sql 使用MyView AND IX_1

4

1 回答 1

6

除非您使用的是 Enterprise/Developer 版本,否则您需要包含WITH NOEXPAND 提示

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

设计索引视图

可以在任何版本的 SQL Server 2008 中创建索引视图。在 SQL Server 2008 Enterprise 中,查询优化器会自动考虑索引视图。要在所有其他版本中使用索引视图,必须使用 NOEXPAND 表提示。

(而开发者版基本上是企业版,许可不同)

于 2010-12-13T10:41:05.510 回答