0

パーティション分割されたビューを機能させようとしていますが、クエリ オプティマイザーが両方のテーブルをスキャンしています。これが私のスクリプトです:

CREATE TABLE A(DataDate [date] NOT NULL CHECK(datepart(yy, DataDate) <= 2010)) 

CREATE TABLE B(DataDate [date] NOT NULL CHECK(datepart(yy, DataDate) > 2010))

CREATE VIEW V AS SELECT * FROM A UNION ALL SELECT * FROM B 

select * from V where datepart(yy, DataDate) = 2009

しかし、実行計画を見ると、テーブルAとテーブルBの両方がスキャンされ、両方のテーブルの「実行回数」が 1 であることがわかりNumber of Executions = 1ます。私はオンです。Number of Executions = 0SQL Server 2012

誰かがこれがどのように機能するのかを明確にできますか? ありがとうございました。

4

2 に答える 2

3

次のように動作するはずです:

CREATE TABLE A(DataDate [date] NOT NULL CHECK(DataDate < '20110101'));

CREATE TABLE B(DataDate [date] NOT NULL CHECK(DataDate >= '20110101'));
go

CREATE VIEW V AS SELECT * FROM A UNION ALL SELECT * FROM B 
go

select * from V where DataDate >= '20090101' and DataDate < '20100101';
go
于 2012-06-22T12:09:01.607 に答える
1

パーティション化されたビューに関するCREATEVIEWのドキュメントから、ベーステーブルに存在する必要のある制約について説明する場合:

テーブルT1で定義された制約C1は、次の形式である必要があります。

C1 ::= < simple_interval > [ OR < simple_interval > OR ...]
< simple_interval > :: = 
< col > { < | > | <= | >= | = < value >} 
| < col > BETWEEN < value1 > AND < value2 >
| < col > IN ( value_list )
| < col > { > | >= } < value1 > AND
< col > { < | <= } < value2 >

制約はこの形式ではないため、パーティション化されたビューにはなりません。関数を呼び出す制約ではなく、@Remusが示したような単純な制約が必要です。


そしてもちろん、BOLでPartitionedViewsを検索する場所で見つかった他のアドバイスは次のとおりです。

1つのサーバーにローカルでデータをパーティション化するための推奨される方法は、パーティション化されたテーブルを使用することです。詳細については、「パーティション化されたテーブルとインデックス」を参照してください。

パーティション化されたテーブルは、SQL Server 2005で導入されて以来、推奨されるパーティション化の方法です。

于 2012-06-22T12:16:25.273 に答える