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


11

パフォーマンスを上げるには、インデックス付きビューを使用する必要があります。この比較表からわかるように、Standard Editionはインデックス付きビューをサポートしていません。しかし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)

回答:


14

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

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

もちろんYMMV :-)

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

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


OrderTotals with(noexpand、index = IXCU_xxx)からスキーマバインディングとして外部ビューを作成しようとすると、「スキーマバインドオブジェクト内でインデックスヒントを指定できない」というメッセージが表示されました。:)
garik '30年

2
@garik:インデックスヒントではなく、NOEXPANDを使用します。いずれにせよ、インデックスは1つしかありません。クラスタ化されているため、テーブルスキャン=インデックススキャン
gbn

議論なし。閉鎖:)
garik

NOEXPAND ...スマートを埋め込むWoaaa ...、LUVそれを...
ジェローム・Verstrynge
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.