【问题标题】:Partitioned view not working分区视图不起作用
【发布时间】:2012-06-22 12:00:45
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    应该像这样工作:

    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
    

    【讨论】:

    • 谢谢。这行得通。我使用 msdn.microsoft.com/en-us/library/ms190019(v=sql.105).aspx 作为指南,它基于 DATEPART,这是我的问题。
    • @user1044169 - 这是一个非常混乱的例子。您会注意到May1998sales 上有多个 检查约束,而实际用于分区的约束在OrderMonth (CHECK (OrderMonth = 5)) 上。 OrderDate 上的那个是红鲱鱼。
    【解决方案2】:

    来自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 引入以来,一直是首选的分区方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多