パーティションビューを作成しようとしていますが、実行計画では依然として基礎となる両方のテーブルにアクセスしていることが示されています。私のパーティションビューは、依然としてすべての基礎となるベーステーブルにアクセスしています
なぜ私のクエリはまだ両方の基礎となるテーブルにアクセスし、それらを連結していますか?
パーティションビューを作成しようとしていますが、実行計画では依然として基礎となる両方のテーブルにアクセスしていることが示されています。私のパーティションビューは、依然としてすべての基礎となるベーステーブルにアクセスしています
なぜ私のクエリはまだ両方の基礎となるテーブルにアクセスし、それらを連結していますか?
ほとんどの場合、問題は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のページをご覧ください。
ありがとう!それがトリックでした。 – Lock
@Lock問題ありません。あなたが使用している正確なデータ型に関する私の答えに行った更新を見てください。 –
テーブルにはいくつのレコードがありますか?ところで、パーティションビューはフィルタ付きの通常のビューと似ています。ビューから選択すると、SQL Serverは依然としてテーブルにアクセスする必要があります。 – FLICKER
@FLICKERこれは間違っています。分割ビューの目的は、特に、 'CHECK'制約で定義された特定の条件に基づいて結果から論理的に除外できるテーブルへのアクセスを避けることです。 –