web-dev-qa-db-ja.com

複数のDBからの非インデックス付きビューとオブジェクトを参照するインデックス付きビューの作成

Create viewステートメントで、次のオブジェクトを次の形式で使用しています。

dbo.objects1 A
INNER JOIN db2.dbo.object2 
INNER JOIN db2.dbo.object3 
INNER JOIN db2.dbo.object4
INNER JOIN db2.dbo.object5

objects1は、インデックスを持つDatabase1のテーブルです。 objects2 through objects5は別のdatabaseにあり、これら4つのオブジェクトはすべてNo indexesで表示されます。

現在、上記の5つのオブジェクトすべてでインデックス付きビューを作成しようとしていますが、SQLサーバーでは許可されていません。

最初のエラーは:

Names must be in two-part format and an object cannot reference itself.

2番目のエラーは次のとおりです。

Cannot schema bind view 'dbo.vw_Order' because name 'db2.dbo.object2' is invalid for schema binding.

今、私はこれらのエラーをグーグルでググって、次の仮定に行きました:

  1. 結合クエリでは、ビューに複数のデータベースのオブジェクトを含めることはできません。
  2. ビューにインデックスを作成するには、ビュー内のすべてのオブジェクトにインデックスがあるか、(関数のように)スキーマバインドする必要があります。

クエリのようにビューを実行する場合、実行プランでは、db2のオブジェクトの列にインデックスを作成することを推奨しています。私の仮定が正しいかどうか教えてください。そうでない場合は、この状況でビューを作成する方法を教えてください。

11
Sanket J

すでに調査を行っているので、インデックス付きビューの定義内のすべてのオブジェクト(テーブル/ビュー)にはTWO PART名前、つまり[Schema].[Object]これは、すべてのオブジェクトが1つのデータベースに存在し、複数のデータベースにわたってインデックス付きビューを作成できないことを意味します。インデックス付きビューには多くの制限があります。可能であれば、ストアドプロシージャの作成を検討してください

あなたが得ている他のエラーはあなたが欠落していることですWITH SCHEMABINDINGビューの定義のオプション。インデックス付きビューを作成するには、WITH SCHEMABINDINGオプションを使用する必要があります。つまり、このビューを削除するまで、基になるテーブルやオブジェクトのスキーマは変更できません。

繰り返しになりますが、ストアドプロシージャを検討することをお勧めします。インデックス付きビューに伴うすべての制限のため、インデックス付きビューを作成することは不可能に思えます。

18
M.Ali

所有者をビュー名とテーブルに追加します。お気に入り:

Create VIEW dbo.MyView
WITH SCHEMABINDING
    AS
    SELECT * From dbo.Users
8

異なるデータベースの2つのオブジェクトを使用してインデックス付きビューを作成することはできません。

2
Ritesh kumar