18

次のビューでインデックスを作成しようとしています。

SELECT     'Candidate' AS Source, CandidateID AS SourceId, LastName + ', ' + FirstName AS SourceName
FROM         dbo.Candidates
UNION
SELECT     'Resource' AS Source, ResourceID AS SourceId, LastName + ', ' + FirstName AS SourceName
FROM         dbo.Resources
UNION
SELECT     'Deal' AS Source, DealID AS SourceId, CONVERT(varchar, Number) + '-' + CONVERT(varchar, RevisionNumber) AS SourceName
FROM         dbo.Deals
UNION
SELECT     'Job Order' AS Source, JobOrderID AS SourceId, CustomerNumber AS SourceName
FROM         dbo.JobOrders

次のエラーが発生します。

Msg 1939, Level 16, State 1, Line 2
Cannot create index on view '_Source' because the view is not schema bound.

WITH SCHEMABINDINGをCREATEに追加しましたが、次のエラーが発生します。

Msg 10116, Level 16, State 1, Line 2
Cannot create index on view 'DEALMAKER.dbo._Source' because it contains one or more UNION, INTERSECT, or EXCEPT operators. Consider creating a separate indexed view for each query that is an input to the UNION, INTERSECT, or EXCEPT operators of the original view.

私の質問は次のとおりです。

このビューにインデックスを作成するにはどうすればよいですか?個別のインデックス付きビューを作成することは実際に機能しますか?

最後に、このビューに参加する可能性のあるクエリのパフォーマンスが本当に向上するのでしょうか。

前もって感謝します!

4

2 に答える 2

26

ユニオン演算子を使用するビューにインデックスを作成することはできません。本当にそれを回避する方法はありません、ごめんなさい!

あなたはこれを見たことがあると思いますが、このMSDNページをチェックしてください。インデックス付きビューの要件を示し、それらが何であるか、およびそれらがどのように機能するかを説明します。

ビューにインデックスを付けることができた場合にパフォーマンス上の利点が見られるかどうかについては、テーブルのサイズに完全に依存します。テーブルにはすでにインデックスが付けられており、ビューで結合やロジックを実行していないと想定しているため、個別のインデックス付きビューの作成に影響はないと思います。

于 2009-04-15T14:02:03.950 に答える
20

なぜ世界でUNIONを使用しているのですか?

SQLにリテラルが含まれていると、重複する可能性はゼロになります。繰り返しになりますが、なぜUNIONを使用するのですか?

UNIONはdistinctを強制的に発生させ、DISTINCTよりも少し遅くなります。

しかし、あなたはこのように見えるものを持っているので:

SELECT 'A'
UNION
SELECT 'B'
UNION
SELECT 'C'

重複する可能性はありません。

UNION ALLに変更すると、クエリの実行速度が大幅に向上します。

これは基本的なSQLです。ビューインデックスを作成するよりも、適切に調整されたクエリを作成することが重要です。基本から始めて、SQLを理解し、クエリを調整します。次に、スペースの消費とDMLの速度低下を心配して、クエリの速度を向上させます。

編集:

クエリ内のリテラルは、テーブル間の重複を防ぎます。残っている唯一の可能性は、テーブル内の重複です。列はPKのように見え、重複を引き起こす可能性のある結合はなく、テーブルはすべてルックアップテーブルのように見えるので、私が言ったことは正しいです。その仮定が正しくない場合は、ALLなしでUNIONを合法的に使用できる可能性があります。ただし、99%の確率で、実際にはALLを使用するつもりであり、間違いが多いため、UNIONのみを使用してSQLにコメントを追加するのが当社の標準です。すなわちUNION-はい私は明確なリストが必要です。

于 2009-04-15T15:08:36.943 に答える