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。我希望表ANumber of Executions = 1,表BNumber of Executions = 0。我在SQL 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

CREATE VIEW的文档中,在分区视图上,讨论基表上必须存在的约束时:

表 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 中查找分区视图的任何地方都可以找到其他建议:

将本地数据分区到一台服务器的首选方法是通过分区表。有关详细信息,请参阅分区表和索引

自 SQL Server 2005 中引入分区表以来,分区一直是首选的分区方法。

于 2012-06-22T12:16:25.273 回答