SQL Server 2008 R2 和索引视图中的执行计划

Posted

技术标签:

【中文标题】SQL Server 2008 R2 和索引视图中的执行计划【英文标题】:SQL Server 2008 R2 and execution plan in the indexed view 【发布时间】:2010-12-13 10:33:23 【问题描述】:

我创建了一个包含三列的索引视图 (MyView):

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()

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

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

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

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

【问题讨论】:

【参考方案1】:

除非您使用的是 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 表提示。

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

【讨论】:

以上是关于SQL Server 2008 R2 和索引视图中的执行计划的主要内容,如果未能解决你的问题,请参考以下文章

了解 SQL Server 2008 R2 中的索引视图更新和查询过程

了解 SQL Server 2008 R2 中索引视图中的列类型

sql server 2008r2 向带有索引的表里大批量插入数据

SQL SERVER 2008 R2 前提:建立了全文索引

SQL Server 2008 r2:如何检查所有视图的运行时错误?

在 SQL Server 2008 R2 中导入/导出视图