1

ビューのパフォーマンスに問題があります。具体的には、必要のないときに高価な結合が実行されています。この問題を最も単純なケースに絞り込み、AdventureWorks サンプル データベースを使用して、人物の名前と電子メール アドレスをまとめた次のビューを作成しました。

create view PersonDetails_View
as
select P.FirstName, P.LastName, A.EmailAddress
from Person.Person P
left outer join Person.EmailAddress A
    ON P.BusinessEntityID = A.BusinessEntityID

このビューに対して次のクエリを実行すると:

select FirstName from PersonDetails_View

生成されるクエリは、次のものと同じです。

select P.FirstName
from Person.Person P
left outer join Person.EmailAddress A
    ON P.BusinessEntityID = A.BusinessEntityID

このクエリでは、不要な結合が実行されています。なぜそれが起こっているのか知っています -行EmailAddressごとに複数のエントリがある場合Person、結果は異なります。ただし、この特定のケースでは、マッピングは 1-1 であり、常にそうなります。生成されたクエリが次のようになるように、この結合が発生しないようにする方法はありますか?

select P.FirstName
from Person.Person P

(この単純なケースはマイクロ最適化のように見えますが、私の状況ではパフォーマンスの問題として、ビュー内の不要な結合を適切にプロファイリングして特定しました - 約束します!)

4

2 に答える 2

1

行う

CREATE UNIQUE INDEX ix
  ON Person.EmailAddress(BusinessEntityID) 

複数の一致がないことを保証するため。それは計画を変更します。

ここに画像の説明を入力

ここに画像の説明を入力

于 2013-04-22T09:54:09.487 に答える
0

このビューをインデックス付きビューにすることができます。そうすれば、パフォーマンスが向上し、ビューからデータをフェッチするたびに結合することもありません。

インデックス付きビューは、結合クエリの結果セット用に個別の物理ストレージを一度作成するため、後でこのビューにアクセスするたびに、単一のテーブルからアクセスするのと同じになります。

于 2013-04-22T09:49:49.083 に答える