2016-04-04 11 views
1

パーティションビューを作成しようとしていますが、実行計画では依然として基礎となる両方のテーブルにアクセスしていることが示されています。私のパーティションビューは、依然としてすべての基礎となるベーステーブルにアクセスしています

SQL Fiddle here

なぜ私のクエリはまだ両方の基礎となるテーブルにアクセスし、それらを連結していますか?

+0

テーブルにはいくつのレコードがありますか?ところで、パーティションビューはフィルタ付きの通常のビューと似ています。ビューから選択すると、SQL Serverは依然としてテーブルにアクセスする必要があります。 – FLICKER

+0

@FLICKERこれは間違っています。分割ビューの目的は、特に、 'CHECK'制約で定義された特定の条件に基づいて結果から論理的に除外できるテーブルへのアクセスを避けることです。 –

答えて

0

ほとんどの場合、問題はCHECKの制約がWHEREの条件と一致しないことが原因です。

あなたのチェック制約

はの形式は以下のとおりである

(datepart(year,[StockDate])=(2016)) 

あなたWHERE状態の形態である:

StockDate = '20160101' 
は完全な日付を使用するようにチェック制約を変更し

(プラス必要はありませんそのような単純なフィルタのために関数を使用する - DATEPART)。次は2016テーブルの場合です。

[StockDate] >= '01/01/2016' AND [StockDate] <= '12/31/2016' 

他のテーブルでは、両方の述語の年をテーブルの年と一致するように変更します。

問題のフィールドがDATEデータ型であるため、上記の構文では時間コンポーネントは示されません。データ型がDATETIMEた場合、その範囲の終わりには、のように表現される必要があるであろう:パーティションビューの詳細については

'12/31/2016 23:59.59.997' 

Using Partitioned Viewsについては、MSDNのページをご覧ください。

+1

ありがとう!それがトリックでした。 – Lock

+0

@Lock問題ありません。あなたが使用している正確なデータ型に関する私の答えに行った更新を見てください。 –

関連する問題