非企业版和性能的 noexpand 提示

gar*_*rik 11 performance sql-server-2008 clustered-index view

我必须使用索引视图来达到性能。正如我从这个比较表中看到的,标准版不支持索引视图。但是 BOL 说:

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

那么它会起作用吗(我说的是性能)

select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals)
Run Code Online (Sandbox Code Playgroud)

在 SQL Server 标准版上以及它的工作原理

select * from dbo.OrderTotals
Run Code Online (Sandbox Code Playgroud)

在企业版上?

这是查看代码:

CREATE VIEW dbo.OrderTotals
WITH SCHEMABINDING
AS
select 
    OrderId     =   r.OrderId                   
  , TotalQty            =   SUM(r.Quantity)
  , TotalGrossConsid    =   SUM(r.Price * r.Quantity)
  , XCount      =   COUNT_BIG(*)
from dbo.Order r
group by r.OrderId

CREATE UNIQUE CLUSTERED INDEX IXCU_OrderTotals ON OrderTotals (OrderId)
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 14

不同之处在于没有提示的企业版可能决定不使用索引视图而是使用基表。

我个人的经验是 SQL Server 在这方面有点脑残。我几乎总是不得不使用提示:即使计划在视图上扫描而不是基表上的索引搜索“看起来”更糟,但查询速度更快,IO 更少。它也更一致地运行

当然是 YMMV :-)

所以,为了回答,根据我所看到的,它会(应该?)工作相同。其他人可能有不同的经历,我对其他答案很感兴趣

为了避免在任何地方使用提示,您可以使用提示将索引视图包装在另一个视图中:提示向内传播到所有外部查询将自动具有 NOEXPAND。