web-dev-qa-db-ja.com

非エンタープライズ版とパフォーマンスのnoexpandヒント

パフォーマンスを達成するには、インデックス付きビューを使用する必要があります。私が見ることができるように この比較表 標準版はインデックス付きビューをサポートしていません。しかしBOLは言う:

インデックス付きビューは、SQL Serverのどのエディションでも作成できます。 SQL Server Enterpriseでは、クエリオプティマイザーは自動的にインデックス付きビューを考慮します。他のすべてのエディションでインデックス付きビューを使用するには、NOEXPANDテーブルヒントを使用する必要があります。

それでうまくいくでしょう(私はパフォーマンスについて話している)

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

sQL Server Standardエディションと同様に機能します

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)
11
garik

違いは、ヒントのないEnterpriseエディションでは、インデックス付きビューではなくベーステーブルを使用することを決定する可能性があることです。

私の個人的な経験では、SQL Serverはこれについていくらか頭がおかしいです。ほとんどの場合、ヒントを使用する必要があります。クエリが高速であるIOプランは、ベーステーブルでのインデックスシークではなく、ビューでのスキャンの方が "見た目が悪い"場合でも、より一貫して実行されます

もちろんYMMV :-)

だから、答えるために、それは私が見たものに基づいて同じように動作するはずです(すべきですか?)他の人々は異なる経験をしているかもしれません、そして私は他の答えに興味があります

ヒントの使用を回避するために、インデックス付きビューを別のビューのヒントでラップすることができます。ヒントは、すべての外部クエリに内部に伝播し、自動的にNOEXPANDを持ちます。

14
gbn