分区视图不起作用

时间:2012-06-22 12:00:46

标签: sql-server sql-server-2012 partitioned-view

我试图让分区视图工作,但仍然看到查询优化器扫描两个表。这是我的剧本:

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.我我们希望表 A 拥有Number of Executions = 1,而表 B 拥有Number of Executions = 0。我在SQL Server 2012

有人可以澄清这应该如何运作吗?谢谢。

2 个答案:

答案 0 :(得分: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

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

  

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

自从在SQL Server 2005中引入分区以来,

分区一直是首选的分区方法。