约束与分区视图中的位置之间的差异

时间:2012-11-30 11:00:45

标签: sql sql-server sql-server-2008 partitioning

在我的新工作中,我在SQL Server 2008 Enterprise中找到了分区视图,如下所示:

...
SELECT     *
FROM [SERVER1].DATA_2012_7_1.dbo.DATA WITH (nolock)
WHERE     DateTime >= '2012-07-01' AND DateTime <= '2012-07-15 23:59:59.997'
UNION ALL
SELECT     *
FROM [SERVER2].DATA_2012_7_16.dbo.DATA WITH (nolock)
WHERE     DateTime >= '2012-07-16' AND DateTime <= '2012-07-31 23:59:59.997'
UNION ALL
...

之前,当我创建分区视图时,总是在日期列中添加CONSTRAINT。但在我的示例中,在此视图中使用的所有表都没有CONSTRAINT。 你觉得差异怎么样?这两种观点都能正常运作吗?

1 个答案:

答案 0 :(得分:1)

来自Using Partitioned Views

  

分区视图不需要CHECK约束来返回正确的结果。但是,如果尚未定义CHECK约束,则查询优化器必须搜索所有表,而不是仅搜索覆盖分区列上的搜索条件的表。如果没有CHECK约束,视图将像使用UNION ALL的任何其他视图一样运行。查询优化器不能对存储在不同表中的值进行任何假设,也不能跳过搜索参与视图定义的表。

因此,它可能表现不佳(对于CHECK约束可能消除某些分区的查询)。


查询优化器可能足够智能有效地根据视图内部的WHERE子句与应用的条件之间的交集来执行分区消除在访问视图的查询中 - 但在选择记录的方式以实现消除(CHECK约束)和未记录的方式(优化器组合WHERE子句和其他条件),我知道我选择哪一个。