2

在我的新工作中,我发现 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。但在我的示例中,此视图中使用的所有表都没有约束。你对差异有什么看法?两种观点都会正确且同样迅速地发挥作用吗?

4

1 回答 1

1

使用分区视图

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

因此,它的性能可能不会同样好(对于CHECK约束可能消除某些分区的查询)。


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

于 2012-11-30T14:28:44.593 回答