在我的新工作中,我在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。 你觉得差异怎么样?这两种观点都能正常运作吗?
答案 0 :(得分:1)
分区视图不需要CHECK约束来返回正确的结果。但是,如果尚未定义CHECK约束,则查询优化器必须搜索所有表,而不是仅搜索覆盖分区列上的搜索条件的表。如果没有CHECK约束,视图将像使用UNION ALL的任何其他视图一样运行。查询优化器不能对存储在不同表中的值进行任何假设,也不能跳过搜索参与视图定义的表。
因此,它可能表现不佳(对于CHECK
约束可能消除某些分区的查询)。
查询优化器可能足够智能有效地根据视图内部的WHERE
子句与应用的条件之间的交集来执行分区消除在访问视图的查询中 - 但在选择记录的方式以实现消除(CHECK
约束)和未记录的方式(优化器组合WHERE
子句和其他条件),我知道我选择哪一个。