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

发布于 2024-10-07 11:33:26 字数 909 浏览 2 评论 0原文

我创建了一个由三列组成的索引视图 (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 进行第二次查询。
此外,我等待第二个查询的运行速度与第一个查询的速度相同甚至更快,因为它使用聚集索引中的两列in where 子句

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

是否可以强制 sql 使用 MyViewIX_1

I've created an indexed view (MyView) that consists of three columns:

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

I have created clustered unique index IX_1 on two columns: Table1_ID And Object_CreationDate

I want to run two queries:
1.

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

2.

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

1-st query runs fast (even with DBCC DROPCLEANBUFFERS()) and use simple execution plan via using MyView and IX_1
2-nd query runs not so fast because it uses "old" execution plan (seeking by several indexes in three tables and nested looping)

I misunderstand this situation. As for me, it is natural use IX_1 And MyView for 2-nd query.
Moreover, I wait that 2-nd query runs the same speed or even faster then 1-st, because it uses two columns in where clause that are in clustered index.

I tried run 2-nd query with(index=IX_1) and update statistics for columns, but still have the same execution plan.

Is it possible to force sql use MyView AND IX_1 ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

少女七分熟 2024-10-14 11:33:26

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

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

来自设计索引视图

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

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

Unless you're using Enterprise/Developer edition, you need to include the WITH NOEXPAND hint

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

From Designing Indexed Views:

Indexed views can be created in any edition of SQL Server 2008. In SQL Server 2008 Enterprise, the query optimizer automatically considers the indexed view. To use an indexed view in all other editions, the NOEXPAND table hint must be used.

(And Developer Edition is basically Enterprise Edition, with different licensing)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文