非企业版和性能的noexpand提示


11

我必须使用索引视图才能达到性能。从该比较表中可以看出,标准版不支持索引视图。但是BOL说:

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

这样行得通吗(我在说性能)

select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals)

在SQL Server Standard Edition上正常运行

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)

Answers:


14

区别在于,没有提示的企业版可以决定不使用索引视图,而是使用基表。

我的个人经验是,SQL Server在这方面有点脑筋急转弯。我几乎总是必须使用提示:查询更快,所需的IO更少,即使计划“看起来”更糟糕,因为扫描视图而不是对基表进行索引查找。而且它运行也更加一致

YMMV当然是:-)

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

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


当尝试创建具有模式绑定的外部视图时,出现了“无法在架构绑定的对象中指定索引提示”,例如从OrderTotals with(noexpand,index = IXCU_xxx)中选择*。:)
garik

2
@garik:我只需要NOEXPAND,而不是索引提示。无论如何,只有一个索引:它是聚集的,所以表扫描=索引扫描
gbn

没有讨论。已关闭:)
garik

Woaaa ...嵌入NOEXPAND ...智能,LUV它...
杰罗姆Verstrynge
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.