我试图让分区视图工作,但仍然看到查询优化器扫描两个表。这是我的剧本:
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
。
有人可以澄清这应该如何运作吗?谢谢。
答案 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中查找分区视图的任何地方都可以找到其他建议:
自从在SQL Server 2005中引入分区以来,将数据本地分区到一台服务器的首选方法是通过分区表。有关详细信息,请参阅Partitioned Tables and Indexes。
分区表一直是首选的分区方法。