2

私の新しい仕事で、次のような SQL Server 2008 Enterprise のパーティション ビューを見つけました。

...
SELECT     *
FROM [SERVER1].DATA_2012_7_1.dbo.DATA WITH (nolock)
WHERE     DateTime >= '2012-07-01' AND DateTime <= '2012-07-15 23:59:59.997'
UNION ALL
SELECT     *
FROM [SERVER2].DATA_2012_7_16.dbo.DATA WITH (nolock)
WHERE     DateTime >= '2012-07-16' AND DateTime <= '2012-07-31 23:59:59.997'
UNION ALL
...

以前は、パーティション分割されたビューを作成するときに、常にテーブルに CONSTRAINT を日付列で追加していました。しかし、私の例では、このビューで使用するすべてのテーブルに CONSTRAINT がありません。違いについてどう思いますか?両方のビューが正しく機能し、同じ速度で動作しますか?

4

1 に答える 1

1

パーティション ビューの使用から:

分割ビューが正しい結果を返すために CHECK 制約は必要ありません。ただし、CHECK 制約が定義されていない場合、クエリ オプティマイザーは、分割列の検索条件をカバーするテーブルだけでなく、すべてのテーブルを検索する必要があります。CHECK 制約がない場合、ビューは UNION ALL を使用する他のビューと同じように動作します。クエリ オプティマイザーは、さまざまなテーブルに格納されている値について推測することはできません。また、ビュー定義に含まれるテーブルの検索をスキップすることもできません。

そのため、パフォーマンスが同等ではない可能性があります (CHECK制約によって一部のパーティションが除外された可能性があるクエリの場合)。


クエリ オプティマイザーは、ビューの内部の句と、ビューがアクセスされるクエリで適用される条件との共通部分に基づいて、パーティションの削除を効果的に実行するのに十分なほどスマートである場合がありますが、削除を達成するために文書化された方法 (制約) のいずれかを選択します。 ) と文書化されていないもの (句とその他の条件を組み合わせたオプティマイザー) の場合、どちらを選択するかはわかっています。WHERECHECKWHERE

于 2012-11-30T14:28:44.593 に答える