2

3 つの列で構成されるインデックス付きビュー ( MyView ) を作成しました。

Table1_ID (int not null)
Object_CreationDate (datetime, null)
Objec_Count(bigint null)

クラスター化された一意のインデックスTable1_IDIX_1を 2 つの列に作成しました。Object_CreationDate

2 つのクエリを実行したい:
1.

Select * from [dbo].MyView
where Table1_ID = 10

2.

 Select * from [dbo].MyView
where Table1_ID = 10
AND Object_CreationDate <= GETDATE()

最初のクエリは高速に実行され (DBCC DROPCLEANBUFFERS()を使用しても)、MyView と IX_1 を使用して単純な実行プランを使用し
ますループ)

私はこの状況を誤解しています。私としては、2番目のクエリにIX_1 とMyViewを使用するのが自然です。さらに、クラスター化インデックスにある where 句
で 2 つの列を使用するため、2 番目のクエリが 1 番目のクエリと同じか、それよりも高速に実行されることを待ちます。

2 番目のクエリwith(index=IX_1)を実行して列の統計を更新しようとしましたが、実行計画は同じです。

SQL でMyView AND IX_1を強制的に使用することは可能ですか?

4

1 に答える 1

6

Enterprise/Developer エディションを使用している場合を除き、 WITH NOEXPAND ヒントを含める必要があります。

 Select * from [dbo].MyView WITH (NOEXPAND)
where Table1_ID = 10
AND Object_CreationDate <= GETDATE()

インデックス付きビューの設計から:

インデックス付きビューは、SQL Server 2008 のどのエディションでも作成できます。SQL Server 2008 Enterprise では、クエリ オプティマイザーがインデックス付きビューを自動的に考慮します。他のすべてのエディションでインデックス付きビューを使用するには、NOEXPAND テーブル ヒントを使用する必要があります。

(そして、Developer Edition は基本的に Enterprise Edition であり、ライセンスが異なります)

于 2010-12-13T10:41:05.510 に答える