我必须使用索引视图来达到性能。正如我从这个比较表中看到的,标准版不支持索引视图。但 BOL 说:
可以在任何版本的 SQL Server 中创建索引视图。在 SQL Server Enterprise 中,查询优化器会自动考虑索引视图。要在所有其他版本中使用索引视图,必须使用 NOEXPAND 表提示。
那么它会起作用吗(我说的是性能)
select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals)
在 SQL Server 标准版上以及它的工作原理
select * from dbo.OrderTotals
在企业一号上?
这是查看代码:
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)
不同之处在于没有提示的企业版可能决定不使用索引视图而是使用基表。
我个人的经验是,SQL Server 在这方面有点脑残。我几乎总是不得不使用提示:即使计划“看起来”更糟糕,扫描视图而不是索引在基表上查找,查询也更快,IO 更少。而且它的运行也更加一致
当然是 YMMV :-)
所以,要回答,它会(应该?)根据我所看到的情况同样工作。其他人可能有不同的经历,我对其他答案感兴趣
为了避免在任何地方使用提示,您可以使用提示将索引视图包装在另一个视图中:提示向内传播到所有外部查询将自动具有 NOEXPAND。