4

テーブル ("Users") に対してビュー ("UsersActive") を使用しています。ビューにはフィルターが 1 つしかなく、DateTime Users.DeletedOn が NULL かどうかをチェックします。基本的に、削除されていないすべてのユーザーが含まれます。

テーブルではなくビューに対して Linq クエリを実行した場合、引き続きテーブル インデックスを使用するのでしょうか、それともビュー用に特別なインデックスを作成する必要がありますか? 私の理解では、ビューは定義済みのクエリに他ならず、これを直接クエリしているかのように機能するはずです。

SELECT * FROM ユーザー WHERE DeletedON = NULL

基になるテーブルのインデックスが引き続き使用されるという私の仮定は正しいですか?

4

5 に答える 5

6

ほとんどの場合、SQL Server クエリ オプティマイザーは、ベース テーブルのインデックスを使用できるほどスマートです。これは、クエリ プランを見ればわかります。

Enterprise Edition の SQL Server を使用している場合は、インデックス付きビューも使用できます。

于 2009-06-01T19:29:08.647 に答える
2

ビューは、基礎となるSQLステートメントに対して完全に透過的です。これは、信頼性の高い設計上の前提です。

于 2009-06-01T19:31:40.780 に答える
1

インデックス付きビューは、インデックス付きでないビューとは大きく異なります。

ビューはエンジンによって効果的にインラインで展開できるため、オプティマイザーによって決定される任意のテーブル インデックスを使用できます。

インデックス付きビューは、インデックスを具体化 (および最新の状態に維持) します。これはビューのユーザーが利用できますが、まだ使用されていない可能性があります。

あなたの例に基づく追加のメモ - インデックスは、NULL 基準では、フラグやコード列で使用できるほど効果的に使用されない場合があります。

于 2009-06-01T19:42:51.833 に答える
0

ほとんどの場合、クエリを書き直す必要があります。

SELECT * FROM ユーザー WHERE DeletedON IS NULL

DeletedON IS NULL であっても、DeletedON = NULL は真になりません。

于 2009-06-01T21:39:37.993 に答える
-1

インデックスが作成されていない場合、ビューは、それを定義するクエリを使用して毎回再生成されます。そのクエリのテーブルにインデックスが付けられている場合、テーブルのインデックスが使用されます。

ビューにインデックスを付けることもできます。その場合、データセットは物理ディスクにコミットされ、2セットのインデックスが作成されます。

于 2009-06-01T19:30:35.773 に答える