are*_*-ru 2 sql-server indexed view sql-server-2008-r2
我创建了一个由三列组成的索引视图(MyView):
Table1_ID (int not null)
Object_CreationDate (datetime, null)
Objec_Count(bigint null)
Run Code Online (Sandbox Code Playgroud)
我在两列上创建了集群唯一索引 IX_1:Table1_ID和Object_CreationDate
我想运行两个查询:
1.
Select * from [dbo].MyView
where Table1_ID = 10
Run Code Online (Sandbox Code Playgroud)
2.
Select * from [dbo].MyView
where Table1_ID = 10
AND Object_CreationDate <= GETDATE()
Run Code Online (Sandbox Code Playgroud)
1-st查询运行速度很快(即使使用DBCC DROPCLEANBUFFERS())并使用简单的执行计划,通过使用MyView和IX_1
2-nd查询运行不是那么快,因为它使用"旧"执行计划(由三个表中的几个索引寻找并嵌套循环)
我误解了这种情况.至于我,自然使用IX_1和MyView进行第二次查询.
此外,我等待第二个查询以相同的速度运行,甚至比第一个更快,因为它在聚集索引中的where子句中使用两列.
我尝试运行第二次查询with(index=IX_1)并更新列的统计信息,但仍然具有相同的执行计划.
是否有可能强制sql使用MyView和IX_1?
除非您使用的是Enterprise/Developer版本,否则您需要包含WITH NOEXPAND提示
Select * from [dbo].MyView WITH (NOEXPAND)
where Table1_ID = 10
AND Object_CreationDate <= GETDATE()
Run Code Online (Sandbox Code Playgroud)
从设计索引视图:
可以在任何版本的SQL Server 2008中创建索引视图.在SQL Server 2008 Enterprise中,查询优化器会自动考虑索引视图.要在所有其他版本中使用索引视图,必须使用NOEXPAND表提示.
(而开发人员版基本上是企业版,具有不同的许可)
| 归档时间: |
|
| 查看次数: |
1169 次 |
| 最近记录: |