Sql-Server-2008

noexpand 非企業版和性能提示

  • November 14, 2018

我必須使用索引視圖來達到性能。正如我從這個比較表中看到的,標準版不支持索引視圖。但 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。

引用自:https://dba.stackexchange.com/questions/3044